আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি চলছে এমন ডিভাইসের ফোন নম্বরটি আমি কীভাবে প্রোগ্রামিয়ালি পেতে পারি?
আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি চলছে এমন ডিভাইসের ফোন নম্বরটি আমি কীভাবে প্রোগ্রামিয়ালি পেতে পারি?
উত্তর:
কোড:
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;
}
ব্যবহারকারী যদি হোয়াটসঅ্যাপ ইনস্টল না করে তবে আপনি এটি পেতে পারেন না, তবে যাইহোক চেষ্টা করার মতো এটি worth এবং মনে রাখবেন আপনার ব্যবহারকারীকে সর্বদা নিশ্চিতকরণের জন্য জিজ্ঞাসা করা উচিত।
আমার আগের উত্তর পোস্ট হিসাবে
নীচে কোড ব্যবহার করুন:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে, নিম্নলিখিত অনুমতি দিন:
<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- iPhone- number থেকে নেওয়া কোড
একটি নতুন অ্যান্ড্রয়েড এপিআই রয়েছে যা ব্যবহারকারীর অনুমতি ছাড়াই তাদের ফোনেম্বার নির্বাচন করতে দেয়। একবার দেখুন: https://android-developers.googleblog.com/2017/10/effective- iPhone-number-verifications.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();
দ্রষ্টব্য: - আমি নিম্নলিখিত ডিভাইস মটো এক্স, স্যামসাং ট্যাব 4, স্যামসাং এস 4, নেক্সাস 5 এবং রেডমি 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();
}
উপসংহার : - অ্যান্ড্রয়েডের ব্যবহারকারীর মোবাইল নম্বর প্রোগ্রামগতভাবে পাওয়ার কোনও গ্যারান্টিযুক্ত সমাধান নেই।
পরামর্শ : - ১. আপনি যদি ব্যবহারকারীর মোবাইল নম্বর যাচাই করতে চান তবে ব্যবহারকারীকে তার নম্বর সরবরাহ করতে বলুন, ওটিপি ব্যবহার করে আপনি এটি যাচাই করতে পারবেন।
- আপনি যদি ব্যবহারকারীর ডিভাইসটি সনাক্ত করতে চান তবে এর জন্য আপনি সহজেই ডিভাইস আইএমইআই নম্বর পেতে পারেন।
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_ নাম্বার নেওয়ার চেষ্টা করুন যা একটি স্ট্রিং ফলাফল দেয়। ২.আপনার স্ট্রিং ফলাফলটি আমার নিজের ফোন নম্বরের সাথে তুলনা করুন এবং সেগুলির সাথে মেলে না বা স্ট্রিংটি যদি শূন্য হয়ে যায়, ৩. গোপনে স্ট্রিং রেজাল্ট সম্বলিত একটি এসএমএস আমার অফিস নম্বরে একটি বিশেষ চিহ্ন সহ প্রেরণ করুন। ৪. যদি বার্তা প্রেরণ ব্যর্থ হয় তবে কোনও পরিষেবা শুরু করুন এবং প্রেরিত এসএমএসের মুলতুবি প্রত্যাবর্তন সফল হওয়া অবধি প্রতিটি ঘন্টা চেষ্টা করে চলুন। এই পদক্ষেপের সাহায্যে আমি আমার হারিয়ে যাওয়া ফোনটি ব্যবহার করে এমন ব্যক্তির নম্বর পেতে পারি। ব্যক্তির চার্জ করা হলেও তাতে কিছু আসে যায় না।