मैं उस प्रोग्राम का फ़ोन नंबर कैसे प्राप्त कर सकता हूं जो मेरा एंड्रॉइड ऐप चला रहा है?
मैं उस प्रोग्राम का फ़ोन नंबर कैसे प्राप्त कर सकता हूं जो मेरा एंड्रॉइड ऐप चला रहा है?
जवाबों:
कोड:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
आवश्यक अनुमति:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
अत्यधिक उत्कीर्ण टिप्पणियों के अनुसार, जागरूक होने के लिए कुछ चेतावनी हैं। यह लौट सकते हैं null
या ""
या यहाँ तक कि "???????"
, और यह है कि अब मान्य नहीं एक बासी फोन नंबर लौट सकते हैं। यदि आप कुछ ऐसा चाहते हैं जो डिवाइस की विशिष्ट पहचान करता है, तो आपको getDeviceId()
इसके बजाय उपयोग करना चाहिए ।
null
। यह कहा जा रहा है, मैं एक बेहतर जवाब के बारे में पता नहीं हूँ।
इस समस्या का कोई गारंटीकृत समाधान नहीं है क्योंकि फ़ोन नंबर भौतिक रूप से सभी सिम-कार्डों पर संग्रहीत नहीं है, या नेटवर्क से फोन पर प्रसारित किया जाता है। यह कुछ देशों में विशेष रूप से सच है जिनके लिए भौतिक पता सत्यापन की आवश्यकता होती है, संख्या असाइनमेंट केवल बाद में होता है। फोन नंबर असाइनमेंट नेटवर्क पर होता है - और सिम कार्ड या डिवाइस को बदले बिना बदला जा सकता है (जैसे कि यह कैसे पोर्टिंग समर्थित है)।
मुझे पता है कि यह दर्द है, लेकिन सबसे अधिक संभावना सबसे अच्छा समाधान है कि उपयोगकर्ता को एक बार फोन नंबर दर्ज करने और इसे स्टोर करने के लिए कहें।
वास्तव में एक वैकल्पिक समाधान है जिस पर आप विचार करना चाहते हैं, यदि आप इसे टेलीफोनी सेवा के माध्यम से प्राप्त नहीं कर सकते हैं।
आज तक, आप एक और बड़े एप्लिकेशन व्हाट्सएप पर भरोसा कर सकते हैं, का उपयोग कर 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;
}
बेशक आप इसे प्राप्त नहीं कर सकते हैं यदि उपयोगकर्ता ने व्हाट्सएप स्थापित नहीं किया है, लेकिन इसके लायक वैसे भी प्रयास करने के लिए। और याद रखें कि आपको उपयोगकर्ता से हमेशा पुष्टि के लिए पूछना चाहिए।
जैसा कि मेरे पहले उत्तर में पोस्ट किया गया था
नीचे दिए गए कोड का उपयोग करें:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
AndroidManifest.xml में, निम्नलिखित अनुमति दें:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
लेकिन याद रखें, यह कोड हमेशा काम नहीं करता है, क्योंकि सेल फोन नंबर सिम कार्ड और नेटवर्क ऑपरेटर / सेल फोन वाहक पर निर्भर है।
इसके अलावा, फ़ोन -> सेटिंग्स -> के बारे में -> फ़ोन पहचान की जाँच करें , यदि आप वहां संख्या देख पा रहे हैं, तो उपरोक्त कोड से फ़ोन नंबर प्राप्त करने की संभावना अधिक है। यदि आप सेटिंग में फ़ोन नंबर नहीं देख पा रहे हैं, तो आप इस कोड के माध्यम से प्राप्त नहीं कर पाएंगे!
सुझाए गए समाधान:
ऐप के पहले लॉन्च के दौरान एक समय गतिविधि के रूप में उपरोक्त 4 चरण करें। बाद में, जब भी फोन नंबर की आवश्यकता हो, साझा प्राथमिकता में उपलब्ध मूल्य का उपयोग करें।
तो यह है कि आप बिना अनुमति और हैक के प्ले सर्विसेज एपीआई के माध्यम से एक फोन नंबर का अनुरोध कैसे करते हैं। स्रोत और पूर्ण उदाहरण ।
अपने बिल्ड.ग्रेड में (संस्करण 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;
}
}
यह इस तरह एक संवाद उत्पन्न करेगा:
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 से लिया गया कोड
एक नया एंड्रॉइड एप है जो उपयोगकर्ता को अनुमति के बिना अपने फोननंबर का चयन करने की अनुमति देता है। यहां देखें : 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);
}
बस उपरोक्त उत्तरों में उपरोक्त स्पष्टीकरण के लिए थोड़ा सा यहाँ जोड़ना चाहते हैं। जिससे दूसरों के लिए भी समय की बचत होगी।
मेरे मामले में इस पद्धति ने कोई भी मोबाइल नंबर नहीं लौटाया, एक खाली स्ट्रिंग लौटा दी गई। यह इस मामले के कारण था कि मैंने नए सिम पर अपना नंबर पोर्ट किया था। इसलिए यदि मैं सेटिंग> फ़ोन के बारे में> स्थिति> मेरे फ़ोन नंबर पर जाता हूं तो यह मुझे "अज्ञात" दिखाता है।
कभी-कभी, कोड रिटर्न 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" />
आशा है कि इस मदद करता है, धन्यवाद!
String s1
फोन नंबर होगा।
सबसे पहले उपयोगकर्ताओं का मोबाइल नंबर लेना नैतिक नीति के खिलाफ है, पहले यह संभव था लेकिन अब मेरे शोध के अनुसार इसके लिए कोई ठोस समाधान उपलब्ध नहीं है, कुछ कोड का उपयोग करके मोबाइल नंबर प्राप्त करना संभव है लेकिन कोई गारंटी नहीं है कि यह काम करेगा केवल कुछ डिवाइस में। बहुत खोज के बाद मुझे केवल तीन समाधान मिले लेकिन वे सभी डिवाइस में काम नहीं कर रहे हैं।
निम्नलिखित कारण है कि हमें क्यों नहीं मिल रहा है।
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 प्राइम में इस समाधान का परीक्षण किया है, लेकिन यह हर बार काम नहीं करता है, क्योंकि यह खाली स्ट्रिंग वापस आ जाता है, इसलिए यह निष्कर्ष बेकार है
नोट: - यह भी गारंटीकृत और कुशल समाधान नहीं है, मैंने इस समाधान का कई डिवाइस में परीक्षण किया है, लेकिन इसने केवल 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. यदि आप उपयोगकर्ता के मोबाइल नंबर को सत्यापित करना चाहते हैं तो उपयोगकर्ता को अपना नंबर प्रदान करने के लिए कहें, ओटीपी का उपयोग करके आप यह सत्यापित कर सकते हैं।
- यदि आप उपयोगकर्ता के डिवाइस की पहचान करना चाहते हैं, तो इसके लिए आप आसानी से डिवाइस का IMEI नंबर प्राप्त कर सकते हैं।
TelephonyManager
सही समाधान नहीं है, क्योंकि कुछ मामलों में संख्या सिम में संग्रहीत नहीं है। मेरा सुझाव है कि आपको पहली बार एप्लिकेशन के खुलने पर उपयोगकर्ता के फ़ोन नंबर को संग्रहीत करने के लिए साझा प्राथमिकता का उपयोग करना चाहिए और जब भी आपको आवश्यकता होगी नंबर का उपयोग किया जाएगा।
मेरे द्वारा पाए गए समाधानों का एक संयोजन यहां दिया गया है (नमूना परियोजना यहां , यदि आप ऑटो-फिल भी जांचना चाहते हैं):
प्रकट
<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 ""
}
}
}
थोड़ा सा योगदान। मेरे मामले में, कोड ने एक त्रुटि अपवाद लॉन्च किया। मुझे एक एनोटेशन की आवश्यकता है जो कोड के लिए चलाया जाए और उस समस्या को ठीक कर दे। यहाँ मैंने इस कोड को जाने दिया।
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()
, आप की जरूरत स्वाद पर निर्भर करता है।
उम्मीद है की यह मदद करेगा।
इस निर्भरता को जोड़ें:
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)
}
}
}
एक सुरक्षा ऐप पर काम करते समय जिसे फोन नंबर प्राप्त करने की आवश्यकता थी, जो कभी मेरा फोन उनके हाथों में आ सकता है, मुझे ऐसा करना पड़ा; 1. बूट पूरा प्राप्त करें और फिर टेलीफोनी मैनजर से लाइन 1_Number प्राप्त करने का प्रयास करें जो एक स्ट्रिंग परिणाम देता है। 2. स्ट्रिंग परिणाम की तुलना मेरे स्वयं के फ़ोन नंबर से करें और यदि वे मेल नहीं खाते हैं या स्ट्रिंग वापस नहीं आती हैं, तो 3. चुपके से स्ट्रिंग रिजल्ट के साथ एक एसएमएस भेजें और मेरे कार्यालय नंबर पर एक विशेष हस्ताक्षर करें। 4. यदि संदेश भेजने में विफल रहता है, तो एक सेवा शुरू करें और प्रत्येक घंटे के बाद प्रयास करते रहें जब तक कि एसएमएस लंबित इरादे सफल न हो जाए। इस कदम से मुझे अपने खोए हुए फोन का उपयोग करने वाले व्यक्ति की संख्या मिल सकती है। इससे कोई फर्क नहीं पड़ता कि व्यक्ति को आरोपित किया गया है या नहीं।