android - कवर - नंबर से नाम




प्रोग्रामिक रूप से एंड्रॉइड फोन का फोन नंबर प्राप्त करें (10)

मैं अपने एंड्रॉइड ऐप को चलाने वाले डिवाइस का प्रोग्राम नंबर कैसे प्राप्त कर सकता हूं?


अपडेट करें: यह उत्तर अब उपलब्ध नहीं है क्योंकि व्हाट्सएप ने फोन नंबर को खाता नाम के रूप में उजागर करना बंद कर दिया था, कृपया इस उत्तर की उपेक्षा करें।

वास्तव में एक वैकल्पिक समाधान है जिसे आप विचार करना चाहते हैं, अगर आप इसे टेलीफ़ोनी सेवा के माध्यम से नहीं प्राप्त कर सकते हैं।

आज के रूप में, आप AccountManager का उपयोग करके, एक और बड़े एप्लिकेशन व्हाट्सएप पर भरोसा कर सकते हैं। लाखों उपकरणों में यह एप्लिकेशन इंस्टॉल है और यदि आप टेलीफ़ोनी मैनेजर के माध्यम से फोन नंबर नहीं प्राप्त कर सकते हैं, तो आप इसे एक शॉट दे सकते हैं।

अनुमति:

<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);
}

व्हाट्सएप खाते के लिए एक्ट टाइप देखें

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

बेशक यदि आप व्हाट्सएप इंस्टॉल नहीं करते हैं तो आपको यह नहीं मिल सकता है, लेकिन वैसे भी कोशिश करने के लायक है। और याद रखें कि आपको हमेशा पुष्टि के लिए उपयोगकर्ता से पूछना चाहिए।


TelephonyManager सही समाधान नहीं है, क्योंकि कुछ मामलों में सिम में नंबर संग्रहीत नहीं किया जाता है, मेरे सुझाव के कारण, आपको उपयोगकर्ता के फोन नंबर को स्टोर करने के लिए पहली बार साझा प्राथमिकता का उपयोग करना चाहिए, और उसके बाद संख्या तब भी उपयोग की जाएगी आपको आवेदन में चाहिए


उपरोक्त उत्तरों में उपरोक्त स्पष्टीकरणों के लिए बस थोड़ा सा जोड़ना चाहते हैं। जो दूसरों के लिए भी समय बचाएगा।

मेरे मामले में इस विधि ने किसी भी मोबाइल नंबर को वापस नहीं किया, एक खाली स्ट्रिंग वापस कर दी गई थी। इस मामले के कारण मैंने नए सिम पर अपना नंबर पोर्ट किया था। इसलिए यदि मैं सेटिंग> फ़ोन के बारे में> स्थिति> मेरा फोन नंबर में जाता हूं तो यह मुझे "अज्ञात" दिखाता है।


एक नया एंड्रॉइड एपीआई है जो उपयोगकर्ता को अनुमति के बिना अपने फोननंबर का चयन करने की अनुमति देता है। यहां एक नज़र डालें: https://android-developers.googleblog.com/2017/10/effective-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);
} 

एपीआई 26 के साथ शुरुआत, getDeviceId() अब बहिष्कृत है। इसके बजाय getImei() उपयोग करें। आप निम्नलिखित कोड का उपयोग कर सकते हैं।

String id;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    id = telephonyManager.getImei();
else
    id = telephonyManager.getDeviceId();

कभी-कभी, कोड नीचे 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" />

उम्मीद है कि यह मदद करता है, धन्यवाद!


जैसा कि मेरे पहले के जवाब में पोस्ट किया गया था

नीचे कोड का प्रयोग करें:

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

AndroidManifest.xml में, निम्न अनुमति दें:

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

लेकिन याद रखें, यह कोड हमेशा काम नहीं करता है, क्योंकि सेल फोन नंबर सिम कार्ड और नेटवर्क ऑपरेटर / सेल फोन वाहक पर निर्भर है।

साथ ही, फोन -> सेटिंग्स -> के बारे में -> फोन पहचान में जांच करने का प्रयास करें, यदि आप वहां नंबर देखने में सक्षम हैं, तो उपरोक्त कोड से फोन नंबर प्राप्त करने की संभावना अधिक है। यदि आप सेटिंग्स में फोन नंबर नहीं देख पा रहे हैं, तो आप इस कोड के माध्यम से प्राप्त नहीं कर पाएंगे!

सुझाए गए वर्कअराउंड:

  1. उपयोगकर्ता से मैन्युअल इनपुट के रूप में उपयोगकर्ता का फोन नंबर प्राप्त करें।
  2. एसएमएस के माध्यम से उपयोगकर्ता के मोबाइल नंबर पर एक कोड भेजें।
  3. फोन नंबर की पुष्टि करने के लिए उपयोगकर्ता को कोड दर्ज करने के लिए कहें।
  4. साझा वरीयता में संख्या को सहेजें।

ऐप के पहले लॉन्च के दौरान उपरोक्त 4 चरणों को एक बार गतिविधि के रूप में करें। बाद में, जब भी फोन नंबर की आवश्यकता होती है, साझा वरीयता में उपलब्ध मूल्य का उपयोग करें।


तो इस तरह आप अनुमति और हैक्स के बिना Play Services API के माध्यम से किसी फ़ोन नंबर का अनुरोध करते हैं। https://android-developers.googleblog.com/2017/10/effective-phone-number-verification.html और पूर्ण उदाहरण

आपके 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;
    }
}

इससे इस तरह एक संवाद उत्पन्न होगा:


यह एक अधिक सरल उत्तर है:

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

सबसे पहले उपयोगकर्ताओं को मोबाइल नंबर नैतिक नीति के खिलाफ है, इससे पहले यह संभव था लेकिन अब मेरे शोध के अनुसार इस के लिए कोई ठोस समाधान उपलब्ध नहीं है, कुछ कोड का उपयोग करके मोबाइल नंबर प्राप्त करना संभव है लेकिन कोई गारंटी नहीं होगी केवल कुछ डिवाइस में। बहुत सारे शोध के बाद मुझे केवल तीन समाधान मिले लेकिन वे सभी डिवाइस में काम नहीं कर रहे हैं।

निम्नलिखित कारण हैं कि हम क्यों नहीं मिल रहे हैं।

1. एंड्रॉइड डिवाइस और नया सिम कार्ड मोबाइल नंबर स्टोर नहीं कर रहा है यदि मोबाइल नंबर डिवाइस में उपलब्ध नहीं है और सिम में तो नंबर प्राप्त करना संभव है, यदि टेलीफ़ोनी मैनेजर का उपयोग करते हुए मोबाइल नंबर वाला कोई पुराना सिम कार्ड है तो हम नंबर अन्य प्राप्त कर सकते हैं बुद्धिमान यह "शून्य" या "" या "??????" वापस कर देगा

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

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

नोट: - मैंने इस समाधान का परीक्षण निम्नलिखित डिवाइस मोटो एक्स, सैमसंग टैब 4, सैमसंग एस 4, नेक्सस 5 और रेड्मी 2 प्राइम में किया है, लेकिन यह खाली स्ट्रिंग लौटने पर हर बार काम नहीं करता है, इसलिए निष्कर्ष यह बेकार है

  1. यह विधि केवल रेड्मी 2 प्राइम में काम कर रही है, लेकिन इसके लिए मैनिफेस्ट में पढ़ने की अनुमति अनुमति जोड़ने की आवश्यकता है।

नोट: - यह गारंटीकृत और कुशल समाधान भी नहीं है, मैंने कई उपकरणों में इस समाधान का परीक्षण किया है, लेकिन यह केवल रेड्मी 2 प्राइम में काम करता है जो दोहरी सिम डिवाइस है, यह मुझे दो मोबाइल नंबर देता है, पहला सही है लेकिन दूसरा वाला नहीं है मेरे दूसरे सिम से संबंधित यह मेरे पुराने सिम कार्ड से संबंधित है जिसका मैं उपयोग नहीं कर रहा हूं।

 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. मेरे शोध में मैंने पाया है कि व्हाट्सएप खाते का उपयोग करके मोबाइल नंबर प्राप्त करना संभव था लेकिन अब नया व्हाट्सएप संस्करण उपयोगकर्ता के मोबाइल नंबर को संग्रहीत नहीं कर रहा है।

निष्कर्ष : - एंड्रॉइड के पास उपयोगकर्ता के मोबाइल नंबर को प्रोग्रामेटिक रूप से प्राप्त करने के लिए कोई गारंटीकृत समाधान नहीं है।

सुझाव : - 1. यदि आप उपयोगकर्ता के मोबाइल नंबर को सत्यापित करना चाहते हैं तो उपयोगकर्ता को अपना नंबर प्रदान करने के लिए कहें, ओटीपी का उपयोग करके आप इसे सत्यापित कर सकते हैं।

  1. यदि आप उपयोगकर्ता के डिवाइस की पहचान करना चाहते हैं, तो इसके लिए आप आसानी से डिवाइस IMEI नंबर प्राप्त कर सकते हैं।





telephonymanager