سؤال

كيف يمكنني الحصول على رقم هاتف الجهاز الذي يقوم بتشغيل تطبيق Android بشكل برمجي؟

هل كانت مفيدة؟

المحلول

شفرة:

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

الإذن المطلوب:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

تحفظات:

وفقًا للتعليقات التي تم التغلب عليها للغاية ، هناك بعض التحذيرات التي يجب أن تكون على دراية بها. هذا يمكن أن يعود null أو "" او حتى "???????", ، ويمكنه إرجاع رقم هاتف قديم لم يعد صالحًا. إذا كنت تريد شيئًا يحدد الجهاز بشكل فريد ، فيجب عليك استخدامه getDeviceId() في حين أن.

نصائح أخرى

لا يوجد حل مضمون لهذه المشكلة لأن رقم الهاتف لا يتم تخزينه جسديًا على جميع بطاقات SIM ، أو يتم بثه من الشبكة إلى الهاتف. هذا صحيح بشكل خاص في بعض البلدان التي تتطلب التحقق من العنوان المادي ، مع حدوث تعيين الأرقام بعد ذلك فقط. يحدث تعيين رقم الهاتف على الشبكة - ويمكن تغييره دون تغيير بطاقة SIM أو الجهاز (على سبيل المثال ، هذه هي الطريقة التي يتم بها دعم النقل).

أعلم أن هذا الألم ، ولكن على الأرجح الحل الأفضل هو أن تطلب من المستخدم إدخال رقم هاتفه مرة واحدة وتخزينه.

تحديث: لم يعد هذه الإجابة متوفرة لأن WhatsApp قد توقف عن كشف رقم الهاتف كاسم حساب ، يرجى تجاهل هذه الإجابة.

يوجد في الواقع حل بديل قد ترغب في مراعاته ، إذا لم تتمكن من الحصول عليه من خلال خدمة الاتصال الهاتفي.

اعتبارًا من اليوم ، يمكنك الاعتماد على تطبيق WhatsApp آخر ، باستخدام AccountManager. تم تثبيت ملايين الأجهزة هذا التطبيق وإذا لم تتمكن من الحصول على رقم الهاتف عبر TelephonyManager, ، قد تعطي هذه لقطة.

الإذن:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

شفرة:

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();

for (Account ac : accounts) {
    String acname = ac.name;
    String actype = ac.type;
    // Take your time to look at all available accounts
    System.out.println("Accounts : " + acname + ", " + actype);
}

يفحص actype لحساب WhatsApp

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

بالطبع قد لا تحصل عليه إذا لم يثبت المستخدم WhatsApp ، ولكن يستحق المحاولة على أي حال. وتذكر أنه يجب عليك دائمًا أن تطلب من المستخدم التأكيد.

كما نشر في بلدي إجابة سابقة

استخدم الرمز أدناه:

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

في Androidmanifest.xml ، أعط الإذن التالي:

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

ولكن تذكر أن هذا الرمز لا يعمل دائمًا ، نظرًا لأن رقم الهاتف الخليوي يعتمد على بطاقة SIM وشركة مشغل الشبكة / حامل الهاتف الخليوي.

أيضا ، حاول تسجيل الوصول الهاتف-> الإعدادات-> حول-> هوية الهاتف, ، إذا كنت قادرًا على عرض الرقم هناك ، فإن احتمال الحصول على رقم الهاتف من الكود أعلاه أعلى. إذا لم تكن قادرًا على عرض رقم الهاتف في الإعدادات ، فلن تتمكن من الوصول عبر هذا الرمز!

الحل البديل المقترح:

  1. احصل على رقم هاتف المستخدم كإدخال يدوي من المستخدم.
  2. أرسل رمزًا إلى رقم جوال المستخدم عبر الرسائل القصيرة.
  3. اطلب من المستخدم إدخال الرمز لتأكيد رقم الهاتف.
  4. احفظ الرقم في المشاركين.

قم بالخطوات الأربعة المذكورة أعلاه كنشاط لمرة واحدة أثناء الإطلاق الأول للتطبيق. في وقت لاحق ، كلما كان رقم الهاتف مطلوبًا ، استخدم القيمة المتاحة في التفضيل المشترك.

private String getMyPhoneNumber(){
    TelephonyManager mTelephonyMgr;
    mTelephonyMgr = (TelephonyManager)
        getSystemService(Context.TELEPHONY_SERVICE); 
    return mTelephonyMgr.getLine1Number();
}

private String getMy10DigitPhoneNumber(){
    String s = getMyPhoneNumber();
    return s != null && s.length() > 2 ? s.substring(2) : null;
}

رمز مأخوذ من http://www.androidsnippets.com/get-my-phone-number

هكذا تطلب رقم هاتف من خلال واجهة برمجة تطبيقات خدمات اللعب دون الإذن والاختراقات. مصدر و مثال كامل.

في build.gradle (الإصدار 10.2.x وأعلى مطلوب):

compile "com.google.android.gms:play-services-auth:$gms_version"

في نشاطك (تم تبسيط الكود):

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Auth.CREDENTIALS_API)
            .build();
    requestPhoneNumber(result -> {
        phoneET.setText(result);
    });
}

public void requestPhoneNumber(SimpleCallback<String> callback) {
    phoneNumberCallback = callback;
    HintRequest hintRequest = new HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest);
    try {
        startIntentSenderForResult(intent.getIntentSender(), PHONE_NUMBER_RC, null, 0, 0, 0);
    } catch (IntentSender.SendIntentException e) {
        Logs.e(TAG, "Could not start hint picker Intent", e);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PHONE_NUMBER_RC) {
        if (resultCode == RESULT_OK) {
            Credential cred = data.getParcelableExtra(Credential.EXTRA_KEY);
            if (phoneNumberCallback != null){
                phoneNumberCallback.onSuccess(cred.getId());
            }
        }
        phoneNumberCallback = null;
    }
}

هذا سيولد مربع حوار مثل هذا:

enter image description here

هناك واجهة برمجة تطبيقات Android جديدة تتيح للمستخدم تحديد عددهم الصوتي دون الحاجة إلى إذن. ألق نظرة على:https://android-developers.googleblog.com/2017/10/ffective-phone-number-verification.html

// Construct a request for phone numbers and show the picker
private void requestHint() {
    HintRequest hintRequest = new HintRequest.Builder()
       .setPhoneNumberIdentifierSupported(true)
       .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
        apiClient, hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
        RESOLVE_HINT, null, 0, 0, 0);
} 

فقط أريد إضافة بعض الشيء هنا إلى التفسيرات المذكورة أعلاه في الإجابات أعلاه. مما سيوفر الوقت للآخرين كذلك.

في حالتي ، لم تعيد هذه الطريقة أي رقم جوال ، تم إرجاع سلسلة فارغة. كان ذلك بسبب الحالة التي قمت بنقل رقمي على SIM الجديد. لذلك إذا ذهبت إلى الإعدادات> حول الهاتف> الحالة> رقم هاتفي يظهر لي "غير معروف".

في بعض الأحيان ، يرجع كود إرجاع null أو سلسلة فارغة.

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

مع الإذن أدناه

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

هناك طريقة أخرى ستتمكن من الحصول على رقم هاتفك ، لم أختبر هذا على أجهزة متعددة ولكن الرمز أعلاه لا يعمل في كل مرة.

حاول أدناه الرمز:

String main_data[] = {"data1", "is_primary", "data3", "data2", "data1", "is_primary", "photo_uri", "mimetype"};
Object object = getContentResolver().query(Uri.withAppendedPath(android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
        main_data, "mimetype=?",
        new String[]{"vnd.android.cursor.item/phone_v2"},
        "is_primary DESC");
if (object != null) {
    do {
        if (!((Cursor) (object)).moveToNext())
            break;
        // This is the phoneNumber
        String s1 = ((Cursor) (object)).getString(4);
    } while (true);
    ((Cursor) (object)).close();
}

ستحتاج إلى إضافة هذين الأذنين.

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />

أتمنى أن يساعد هذا ، شكرًا!

هذه إجابة أكثر بساطة:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}

بادئ ذي بدء ، يكون رقم الهاتف المحمول للمستخدمين مخالفًا للسياسة الأخلاقية ، وكان ذلك ممكنًا في وقت سابق ، ولكن الآن وفقًا لبحثي ، لا يوجد حل قوي متاح لهذا ، باستخدام بعض التعليمات البرمجية ، يمكن الحصول على رقم الهاتف المحمول ولكن لا يوجد ضمان قد يعمل فقط في القليل من الأجهزة. بعد الكثير من الأبحاث ، وجدت ثلاثة حلول فقط لكنها لا تعمل في جميع الأجهزة.

هناك السبب التالي لعدم الحصول على.

1. جهاز أندويد وبطاقة SIM جديدة لا تخزن رقم الهاتف المحمول إذا لم يكن رقم الهاتف المحمول متاحًا في الجهاز وفي SIM ، فكيف يمكن الحصول على الرقم ، إذا كانت أي بطاقة SIM قديمة لها رقم جوال ، فيمكننا استخدام Telephony Manager من الحكمة أن تعيد "فارغ" أو "" أو "؟؟؟؟؟؟"

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

 TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
            TELEPHONY_SERVICE);
    String PhoneNumber =  tel.getLine1Number();

ملاحظة:- لقد اختبرت هذا الحل في متابعة الجهاز Moto X و Samsung Tab 4 و Samsung S4 و Nexus 5 و Redmi 2 ولكنه لا يعمل في كل مرة يعيد فيه سلسلة فارغة ، لذا فإن الاستنتاج هو أنه عديم الفائدة

  1. تعمل هذه الطريقة فقط في Redmi 2 Prime ، ولكن لهذه الحاجة إلى إضافة إذن قراءة الاتصال في Amansest.

ملاحظة:- هذا ليس أيضًا الحل المضمون والفعال ، لقد اختبرت هذا الحل في العديد من الأجهزة ولكنه يعمل فقط في Redmi 2 prim تنتمي إلى SIM الثاني الخاص بي ، فهي تنتمي إلى بطاقة SIM القديمة التي لا أستخدمها.

 String main_data[] = {"data1", "is_primary", "data3", "data2", "data1",
            "is_primary", "photo_uri", "mimetype"};
    Object object = getContentResolver().
            query(Uri.withAppendedPath(android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
            main_data, "mimetype=?",
            new String[]{"vnd.android.cursor.item/phone_v2"},
            "is_primary DESC");
    String s1="";
    if (object != null) {
        do {
            if (!((Cursor) (object)).moveToNext())
                break;
            // This is the phoneNumber
             s1 =s1+"---"+ ((Cursor) (object)).getString(4);
        } while (true);
        ((Cursor) (object)).close();
    }
  1. في بحثي الذي وجدته سابقًا ، كان من الممكن الحصول على رقم الهاتف المحمول باستخدام حساب WhatsApp ولكن الآن إصدار WhatsApp الجديد لا يخزن رقم الهاتف المحمول للمستخدم.

استنتاج:- لا يحتوي Android على أي حل مضمون للحصول على رقم الهاتف المحمول للمستخدم برمجيًا.

اقتراح:- 1. إذا كنت ترغب في التحقق من رقم هاتف المستخدم للمستخدم ، فاطلب من المستخدم تقديم رقمه ، باستخدام OTP ، يمكنك التحقق من ذلك.

  1. إذا كنت ترغب في تحديد جهاز المستخدم ، فيمكنك بسهولة الحصول على رقم IMEI للجهاز.

TelephonyManager ليس الحل الصحيح ، لأنه في بعض الحالات لا يتم تخزين الرقم في SIM. أقترح أنه يجب عليك استخدام التفضيل المشترك لتخزين رقم هاتف المستخدم لأول مرة يتم فتح التطبيق وسيستخدم الرقم كلما احتجت.

القليل من المساهمة. في حالتي ، أطلقت الرمز استثناء خطأ. لقد احتجت إلى وضع شرح توضيحي يتم تشغيل الكود وإصلاح هذه المشكلة. هنا تركت هذا الرمز.

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}

على الرغم من أنه من الممكن الحصول على حسابات بريد صوتي متعددة ، عند الاتصال من رقمك الخاص ، توجهك شركات النقل إلى البريد الصوتي. لذا، TelephonyManager.getVoiceMailNumber() أو TelephonyManager.getCompleteVoiceMailNumber(), ، اعتمادا على النكهة التي تحتاجها.

أتمنى أن يساعدك هذا.

أثناء العمل على تطبيق أمان يحتاج إلى الحصول على رقم هاتف من قد يدخل هاتفي في أيديهم ، كان عليّ القيام بذلك ؛ 1. تلقي التمهيد المكتمل ثم حاول الحصول على line1_number من TelephonyManager الذي يعيد نتيجة سلسلة. 2. قارن عن نتيجة السلسلة برقم هاتفي الخاص ، وإذا لم تتطابق مع أو إرجاع السلسلة ، فالرئة 3 ، 3. أرسل سراً رسالة نصية قصيرة تحتوي على نتيجة السلسلة بالإضافة إلى علامة خاصة على رقم مكتبي. 4. إذا فشل إرسال الرسالة ، ابدأ خدمة واستمر في المحاولة بعد كل ساعة حتى يتم إرسال الرسائل القصيرة المعلقة ناجحة. مع هذه الخطوات ، يمكنني الحصول على عدد الشخص الذي يستخدم هاتفي المفقود. لا يهم إذا تم توجيه الاتهام إلى الشخص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top