प्रोग्राम को एंड्रॉइड फोन का फोन नंबर प्राप्त करें


443

मैं उस प्रोग्राम का फ़ोन नंबर कैसे प्राप्त कर सकता हूं जो मेरा एंड्रॉइड ऐप चला रहा है?


यह संभव नहीं है, सिवाय इसके कि अगर आप इसे स्वयं द्वारा दर्ज करते हैं। फोन नंबर केवल मोबाइल या सिम से नहीं जाना जाता है, केवल नेटवर्क द्वारा ....
tomsoft

3
@tomsoft इसके बारे में सोचें ... फेसबुक ऑटो-मैजिक जैसे ऐप आपके फोन नंबर को कैसे सत्यापित करते हैं ..?
एडी हार्ट

1
@tomsoft नहीं, अधिकांश समय यह आपके फ़ोन नंबर के लिए भी नहीं पूछता है, या यदि ऐसा होता है तो बॉक्स प्रीफ़िल्ड होता है।
एडी हार्ट

1
@tomsoft खैर, मैंने दूसरे दिन फेसबुक के लिए साइन अप किया, और जब उसने मुझे एक कोड लिखा तो उसने मेरा नंबर नहीं मांगा। कोशिश करो। ;)
एडी हार्ट

1
@EddieHart यह भी करो, और मुझे मेरा फोन नंबर पूछा गया है। तो यह पुष्टि करता है कि आम तौर पर बोलना, यह सुलभ नहीं है और कुछ ऑपरेटर सेटअप पर इस जानकारी को जोड़ सकते हैं, लेकिन यह जीएमएस मानक सुविधा नहीं है
15

जवाबों:


484

कोड:

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

आवश्यक अनुमति:

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

चेतावनियां:

अत्यधिक उत्कीर्ण टिप्पणियों के अनुसार, जागरूक होने के लिए कुछ चेतावनी हैं। यह लौट सकते हैं nullया ""या यहाँ तक कि "???????", और यह है कि अब मान्य नहीं एक बासी फोन नंबर लौट सकते हैं। यदि आप कुछ ऐसा चाहते हैं जो डिवाइस की विशिष्ट पहचान करता है, तो आपको getDeviceId()इसके बजाय उपयोग करना चाहिए ।


150
वास्तव में, इतना सही नहीं है। पिछली बार जब मैंने यह तरीका आजमाया था, तो इसने फोन नंबर की सूचना दी थी, जो कि मेरा फोन मूल रूप से था, इससे पहले कि मेरा पुराना मोबाइल नंबर उस पर पोर्ट होता। यह शायद अभी भी करता है, जैसा कि सेटिंग ऐप अभी भी उस डिफेक्ट नंबर को दिखाता है। साथ ही, ऐसी खबरें भी हैं कि कुछ सिम के कारण यह विधि वापस आती है null। यह कहा जा रहा है, मैं एक बेहतर जवाब के बारे में पता नहीं हूँ।
कॉमन्सवेयर

4
निशान सही है। अगर कुछ ऐसा उपयोग करने का इरादा है जो विशिष्ट रूप से फोन की पहचान करता है तो मैं getDeviceId () का उपयोग करूंगा जो IMEA को GSM के लिए वापस कर देगा।
एलेक्स वोलोवॉय

15
(मुझे लगता है कि आप IMEI मतलब है ...?)
ChaimKut

23
खैर, मैंने इसे एंड्रॉइड ओएस 2.2 के साथ नेक्सस वन पर परीक्षण किया और यह अशक्त है
उमर रहमान

43
डेवलपर्स सोच सकते हैं कि वोट की गिनती पर विचार करके यह सही जवाब है। डेवलपर को चेतावनी देने के लिए एक नोट जोड़ा जाना चाहिए कि यह विधि हमेशा फोन नंबर नहीं देगी।
हबीब परवाद

151

इस समस्या का कोई गारंटीकृत समाधान नहीं है क्योंकि फ़ोन नंबर भौतिक रूप से सभी सिम-कार्डों पर संग्रहीत नहीं है, या नेटवर्क से फोन पर प्रसारित किया जाता है। यह कुछ देशों में विशेष रूप से सच है जिनके लिए भौतिक पता सत्यापन की आवश्यकता होती है, संख्या असाइनमेंट केवल बाद में होता है। फोन नंबर असाइनमेंट नेटवर्क पर होता है - और सिम कार्ड या डिवाइस को बदले बिना बदला जा सकता है (जैसे कि यह कैसे पोर्टिंग समर्थित है)।

मुझे पता है कि यह दर्द है, लेकिन सबसे अधिक संभावना सबसे अच्छा समाधान है कि उपयोगकर्ता को एक बार फोन नंबर दर्ज करने और इसे स्टोर करने के लिए कहें।


18
ली गई संख्या को सत्यापित करने के लिए, आप नंबर पर एक sms (एक कोड युक्त) भेज सकते हैं और "android.provider.Telephony.SMS_RECEIVED" पर एक श्रोता लगाकर प्रतिक्रिया को नियंत्रित कर सकते हैं। इस तरह आप यह सुनिश्चित कर सकते हैं कि संख्या सही है और काम कर रही है
होसैन शाहदोस्त

1
रचनात्मक समाधान, लेकिन आप उपयोगकर्ता को यह बताना चाहते हैं कि आप ऐसा सिर्फ उसी स्थिति में कर रहे हैं जब उनसे इसके लिए शुल्क लिया जा रहा हो।
नॉर्मन एच

3
क्या कोई प्रदाता है जो सरल पाठ संदेश प्राप्त करने के लिए शुल्क लेता है ?!
ThiefMaster

9
हाँ बिल्कुल। इससे पहले कि मैं अपनी योजना में टेक्स्टिंग जोड़ूं, मुझे प्रति पाठ संदेश में $ 0.30 का शुल्क लिया गया। कनाडा में रोजर्स।
जॉन क्रॉच

44

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

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

आज तक, आप एक और बड़े एप्लिकेशन व्हाट्सएप पर भरोसा कर सकते हैं, का उपयोग कर 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व्हाट्सएप अकाउंट की जांच करें

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

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


1
मैंने आज ही इसे देखा था जब मैं खातों के साथ खिलवाड़ कर रहा था। यह बहुत बुरा है कि संख्या इस तरह उजागर हो रही है। बेशक, आपको GET_ACCOUNTS अनुमति चाहिए और उस बिंदु पर उपयोगकर्ता को शायद परवाह नहीं है कि ऐप के पास क्या अनुमतियाँ हैं।
jargetz

9
यह समाधान पुराना हो चुका है, व्हाट्सएप फोन नंबर को अब अकाउन्ट नाम पर सेव नहीं करता है, क्या आप जानते हैं कि नए अपडेट के बाद व्हाट्सएप फोन नंबर को कहां बचाता है?
कोहलाद

@ मुझे अद्यतन करने के लिए धन्यवाद, मैं बाद में एक जांच करूंगा और पुष्टि के बाद इस उत्तर को पार करूंगा, इस बीच मुझे पता नहीं है कि वे नंबर कहां बचाते हैं
चोर वाई चुन

3
लेकिन Viber नंबर की पुष्टि! com.viber.voip.account
xnagyg

32

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

नीचे दिए गए कोड का उपयोग करें:

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 चरण करें। बाद में, जब भी फोन नंबर की आवश्यकता हो, साझा प्राथमिकता में उपलब्ध मूल्य का उपयोग करें।


यह उत्तर सभी कारकों को शामिल करता है, इसे स्वीकार किया जाना चाहिए =)
स्लाव फोमिन II

अगर फोन पर डुअल सिम उपलब्ध है तो मैं दोनों मोबाइल नंबर कैसे प्राप्त कर सकता हूं। उपरोक्त कोड के साथ। सिंगल सिम के लिए यह ठीक काम कर रहा है
अमृत

26

तो यह है कि आप बिना अनुमति और हैक के प्ले सर्विसेज एपीआई के माध्यम से एक फोन नंबर का अनुरोध कैसे करते हैं। स्रोत और पूर्ण उदाहरण

अपने बिल्ड.ग्रेड में (संस्करण 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;
    }
}

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

यहां छवि विवरण दर्ज करें


2
संकेत अनुरोध फोन से जुड़े ईमेल खाते से फोन नंबर दिखाता है, यह डिवाइस में कोई सिम नहीं होने पर भी ड्रॉप डाउन दिखाएगा।
अरी

केवल एक सिम होने पर संवाद कितने नंबर दिखाता है? मेरे लिए, यह 5 नंबर दिखाता है। : / :)
1919 को

हम एंड्रॉइड में पहला फोन नंबर अपने आप कैसे चुन सकते हैं?
नूरूल

13
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 से लिया गया कोड


"S.substring (2)" के कारण @JaredBurrows।
कुकी मॉन्स्टर

1
यह मेरे लिए काम नहीं कर रहा है। मुझे एक पूर्ण मूल्य (सूर्योदय सिम कार्ड, स्विट्जरलैंड) मिलता है
ई-प्रकृति

आपका लिंक टूट गया है
Octmañg mürmån

11

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

इसके लिए फायरबेज
व्लाद

@Vlad नहीं यह नहीं है। इसके लिए केवल Google Play सेवाओं की आवश्यकता होती है जो अधिकांश उपकरणों के साथ आती है। ब्लॉगपोस्ट से उद्धरण: 'इससे ​​पहले कि आप शुरू करें और आपको इसका निर्माण और परीक्षण करने की आवश्यकता होगी यह एक फोन नंबर है जो एसएमएस प्राप्त कर सकता है और Google Play सेवाएं 10.2.x और उच्चतर चला सकता है।'
Wirling

9

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

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


मेरा भी, यह क्या शर्त है? घूमना? या हो सकता है कि सिमकार्ड में केवल संख्या ही न हो।
अलेक्जेंड्रे मार्कंडेस

8

कभी-कभी, कोड रिटर्न 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" />

आशा है कि इस मदद करता है, धन्यवाद!


क्या मैं पूछ सकता हूं: दूसरी स्निपेट में कौन सी सेल नंबर है?
iOSAndroidWindowsMobileAppsDev 12

1
मूल्य String s1फोन नंबर होगा।
activesince93

यह कोड मेरे लिए काम नहीं कर रहा है। (आपका अंतिम कोड स्निपेट)। खाली तार लौटाता है।
क्रिस्टी वेल्श

कृपया अपना उत्तर बताएं। संख्या कहां संग्रहीत की जाती है और इसमें संख्या कैसे होती है? किस पर निर्भर
not2qubit

3
@ not2qubit मुझे लगता है कि यह संपर्क ऐप में आत्म संपर्क तक पहुंच रहा है
Samplasion

4

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

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

3

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

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

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

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

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

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

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

नोट: - यह भी गारंटीकृत और कुशल समाधान नहीं है, मैंने इस समाधान का कई डिवाइस में परीक्षण किया है, लेकिन इसने केवल Redmi 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 नंबर प्राप्त कर सकते हैं।

2

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


1
लेकिन यह तरीका त्रुटि प्रवण है। उपयोगकर्ता गलत नंबर दर्ज कर सकता है।
जोहरा खान

3
हां इस उद्देश्य के लिए मैंने एक टेक्स्ट मैसेज का उपयोग किया, जब उपयोगकर्ता एक नंबर दर्ज करता है, तो SmsManager से ऐप संदेश स्वयं ही, और इसके माध्यम से हम मूल संख्या प्राप्त करने के लिए smsReciever का उपयोग कर सकते हैं
नावेद अहमद

1
मेरे पास एक और सवाल है .. इस पद्धति के साथ उपयोगकर्ता द्वारा दिया गया एक एसएमएस शुल्क होगा (यदि यह टोल फ्री नंबर नहीं है) .. क्या कोई अन्य विधि है जिसे मैं उपयोगकर्ता के फोन नंबर प्राप्त कर सकता हूं?
जोहरा खान

हां, निश्चित रूप से उस एसएमएस पर कुछ शुल्क होगा यदि नंबर टोल फ्री नंबर नहीं है।
नावेद अहमद

नहींं, मुझे लगता है कि अब तक टेलीफोनीमैनेजर के बिना ऐसी कोई विधि नहीं है। और मैं अपने उत्तर में टेलीफोन प्रबंधक की समस्या को इंगित करता हूं।
नावेद अहमद

2

मेरे द्वारा पाए गए समाधानों का एक संयोजन यहां दिया गया है (नमूना परियोजना यहां , यदि आप ऑटो-फिल भी जांचना चाहते हैं):

प्रकट

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

build.gradle

    implementation "com.google.android.gms:play-services-auth:17.0.0"

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var googleApiClient: GoogleApiClient

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tryGetCurrentUserPhoneNumber(this)
        googleApiClient = GoogleApiClient.Builder(this).addApi(Auth.CREDENTIALS_API).build()
        if (phoneNumber.isEmpty()) {
            val hintRequest = HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()
            val intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest)
            try {
                startIntentSenderForResult(intent.intentSender, REQUEST_PHONE_NUMBER, null, 0, 0, 0);
            } catch (e: IntentSender.SendIntentException) {
                Toast.makeText(this, "failed to show phone picker", Toast.LENGTH_SHORT).show()
            }
        } else
            onGotPhoneNumberToSendTo()

    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_PHONE_NUMBER) {
            if (resultCode == Activity.RESULT_OK) {
                val cred: Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
                phoneNumber = cred?.id ?: ""
                if (phoneNumber.isEmpty())
                    Toast.makeText(this, "failed to get phone number", Toast.LENGTH_SHORT).show()
                else
                    onGotPhoneNumberToSendTo()
            }
        }
    }

    private fun onGotPhoneNumberToSendTo() {
        Toast.makeText(this, "got number:$phoneNumber", Toast.LENGTH_SHORT).show()
    }


    companion object {
        private const val REQUEST_PHONE_NUMBER = 1
        private var phoneNumber = ""

        @SuppressLint("MissingPermission", "HardwareIds")
        private fun tryGetCurrentUserPhoneNumber(context: Context): String {
            if (phoneNumber.isNotEmpty())
                return phoneNumber
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val subscriptionManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
                try {
                    subscriptionManager.activeSubscriptionInfoList?.forEach {
                        val number: String? = it.number
                        if (!number.isNullOrBlank()) {
                            phoneNumber = number
                            return number
                        }
                    }
                } catch (ignored: Exception) {
                }
            }
            try {
                val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                val number = telephonyManager.line1Number ?: ""
                if (!number.isBlank()) {
                    phoneNumber = number
                    return number
                }
            } catch (e: Exception) {
            }
            return ""
        }
    }
}

pl इस उत्तर पर टिप्पणियाँ देखें stackoverflow.com/a/48210130/5457916 , इस विधि को लागू करने से पहले
humble_wolf

आपके द्वारा प्रदत्त लिंक, जो मैंने यहाँ किया था, उसका केवल एक हिस्सा है। यहाँ मैंने पहली बार स्वयं इसे भरने की कोशिश की है। और इसके लिए कमबैक किया है।
Android डेवलपर

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

मैंने अभी भी वही लिखा है जो मैंने लिखा था। क्षमा करें
Android डेवलपर

1

थोड़ा सा योगदान। मेरे मामले में, कोड ने एक त्रुटि अपवाद लॉन्च किया। मुझे एक एनोटेशन की आवश्यकता है जो कोड के लिए चलाया जाए और उस समस्या को ठीक कर दे। यहाँ मैंने इस कोड को जाने दिया।

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

0

हालाँकि, कई ध्वनि मेल खातों का होना संभव है, जब आपके स्वयं के नंबर से कॉल किया जाता है, तो वाहक आपको ध्वनि मेल के लिए रूट करते हैं। तो, TelephonyManager.getVoiceMailNumber()या TelephonyManager.getCompleteVoiceMailNumber(), आप की जरूरत स्वाद पर निर्भर करता है।

उम्मीद है की यह मदद करेगा।


5
कोई "getCompleteVoiceMailNumber" फ़ंक्शन नहीं है, और getVoiceMailNumber () एक नंबर देता है जो फोन की वास्तविक संख्या से अलग है।
एंड्रॉयड डेवलपर

यह एक ट्रिक है जो दुनिया में केवल कुछ मोबाइल ऑपरेटरों के साथ काम करती है। लेकिन तकनीकी तौर पर वर्कअराउंड हो सकता है।
टेक्नीक

0

इस निर्भरता को जोड़ें: implementation 'com.google.android.gms:play-services-auth:18.0.0'

फ़ोन नंबर सूची लाने के लिए इसका उपयोग करें:

val hintRequest = HintRequest.Builder()
    .setPhoneNumberIdentifierSupported(true)
    .build()

val intent = Credentials.getClient(context).getHintPickerIntent(hintRequest)

startIntentSenderForResult(
    intent.intentSender,
    PHONE_NUMBER_FETCH_REQUEST_CODE,
    null,
    0,
    0,
    0,
    null
)

प्ले सर्विसेज डायलॉग पर टैप करने के बाद:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent? { 
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == PHONE_NUMBER_FETCH_REQUEST_CODE) {
        data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)?.id?.let { 
            useFetchedPhoneNumber(it)
        }
    }
}

-6

एक सुरक्षा ऐप पर काम करते समय जिसे फोन नंबर प्राप्त करने की आवश्यकता थी, जो कभी मेरा फोन उनके हाथों में आ सकता है, मुझे ऐसा करना पड़ा; 1. बूट पूरा प्राप्त करें और फिर टेलीफोनी मैनजर से लाइन 1_Number प्राप्त करने का प्रयास करें जो एक स्ट्रिंग परिणाम देता है। 2. स्ट्रिंग परिणाम की तुलना मेरे स्वयं के फ़ोन नंबर से करें और यदि वे मेल नहीं खाते हैं या स्ट्रिंग वापस नहीं आती हैं, तो 3. चुपके से स्ट्रिंग रिजल्ट के साथ एक एसएमएस भेजें और मेरे कार्यालय नंबर पर एक विशेष हस्ताक्षर करें। 4. यदि संदेश भेजने में विफल रहता है, तो एक सेवा शुरू करें और प्रत्येक घंटे के बाद प्रयास करते रहें जब तक कि एसएमएस लंबित इरादे सफल न हो जाए। इस कदम से मुझे अपने खोए हुए फोन का उपयोग करने वाले व्यक्ति की संख्या मिल सकती है। इससे कोई फर्क नहीं पड़ता कि व्यक्ति को आरोपित किया गया है या नहीं।


डाउनवोट्स क्यों?
humble_wolf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.