Bagaimana saya bisa mendapatkan nomor telepon perangkat yang menjalankan aplikasi Android saya secara terprogram?
Bagaimana saya bisa mendapatkan nomor telepon perangkat yang menjalankan aplikasi Android saya secara terprogram?
Jawaban:
Kode:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Izin yang Dibutuhkan:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Menurut komentar yang sangat terangkat, ada beberapa peringatan yang harus diperhatikan. Ini dapat mengembalikan null
atau ""
bahkan "???????"
, dan dapat mengembalikan nomor telepon basi yang tidak lagi berlaku. Jika Anda menginginkan sesuatu yang secara unik mengidentifikasi perangkat, Anda harus menggunakannya getDeviceId()
.
null
. Meski begitu, saya tidak mengetahui jawaban yang lebih baik.
Tidak ada solusi yang dijamin untuk masalah ini karena nomor telepon tidak secara fisik disimpan di semua kartu SIM, atau disiarkan dari jaringan ke telepon. Ini terutama benar di beberapa negara yang memerlukan verifikasi alamat fisik, dengan penugasan nomor hanya terjadi sesudahnya. Penetapan nomor telepon terjadi di jaringan - dan dapat diubah tanpa mengubah kartu SIM atau perangkat (mis. Ini adalah cara porting didukung).
Saya tahu ini menyakitkan, tetapi kemungkinan besar solusi terbaik adalah meminta pengguna untuk memasukkan nomor teleponnya satu kali dan menyimpannya.
Sebenarnya ada solusi alternatif yang mungkin ingin Anda pertimbangkan, jika Anda tidak bisa mendapatkannya melalui layanan telepon.
Mulai hari ini, Anda dapat mengandalkan aplikasi besar Whatsapp lainnya, menggunakan AccountManager
. Jutaan perangkat memasang aplikasi ini dan jika Anda tidak dapat memperoleh nomor teleponnyaTelephonyManager
, Anda dapat mencobanya.
Izin:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Kode:
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);
}
Periksa actype
akun WhatsApp
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Tentu saja Anda mungkin tidak mendapatkannya jika pengguna tidak menginstal WhatsApp, tetapi patut untuk dicoba. Dan ingat Anda harus selalu meminta konfirmasi kepada pengguna.
Seperti yang diposting di blog saya jawaban sebelumnya
Gunakan kode di bawah ini:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Di AndroidManifest.xml, berikan izin berikut:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Tapi ingat, kode ini tidak selalu berfungsi, karena nomor Ponsel tergantung pada Kartu SIM dan operator Jaringan / operator ponsel.
Juga, coba periksa di Telepon -> Pengaturan -> Tentang -> Identitas Telepon , Jika Anda dapat melihat Nomor di sana, kemungkinan mendapatkan nomor telepon dari kode di atas lebih tinggi. Jika Anda tidak dapat melihat nomor telepon di pengaturan, maka Anda tidak akan bisa mendapatkan kode ini!
Solusi yang disarankan:
Lakukan 4 langkah di atas sebagai aktivitas satu kali selama peluncuran pertama aplikasi. Kemudian, kapan pun nomor telepon diperlukan, gunakan nilai yang tersedia dalam preferensi bersama.
Jadi begitulah cara Anda meminta nomor telepon melalui Play Services API tanpa izin dan peretasan. Sumber dan Contoh lengkap .
Di build.gradle Anda (versi 10.2.x dan lebih tinggi diperlukan):
compile "com.google.android.gms:play-services-auth:$gms_version"
Dalam aktivitas Anda (kode disederhanakan):
@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;
}
}
Ini akan menghasilkan dialog seperti ini:
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;
}
Kode diambil dari http://www.androidsnippets.com/get-my-phone-number
Ada api Android baru yang memungkinkan pengguna untuk memilih nomor telepon mereka tanpa perlu izin. Lihatlah: 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);
}
Hanya ingin menambahkan sedikit di sini untuk penjelasan di atas dalam jawaban di atas. Yang akan menghemat waktu untuk orang lain juga.
Dalam kasus saya, metode ini tidak mengembalikan nomor ponsel apa pun, string kosong dikembalikan. Itu karena kasus saya telah porting nomor saya di sim baru. Jadi jika saya masuk ke Pengaturan> Tentang Telepon> Status> Nomor Telepon Saya ini menunjukkan kepada saya "Tidak Diketahui".
Terkadang, kode di bawah ini mengembalikan null
atau string kosong.
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Dengan izin di bawah ini
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Ada cara lain Anda akan bisa mendapatkan nomor telepon Anda, saya belum menguji ini pada beberapa perangkat tetapi kode di atas tidak berfungsi setiap saat.
Coba kode di bawah ini:
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();
}
Anda perlu menambahkan dua izin ini.
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Semoga ini bisa membantu, Terima kasih!
String s1
akan menjadi nomor telepon.
Pertama-tama mendapatkan nomor ponsel pengguna adalah bertentangan dengan kebijakan Etis, sebelumnya itu mungkin tetapi sekarang sesuai penelitian saya tidak ada solusi yang solid untuk ini, Dengan menggunakan beberapa kode dimungkinkan untuk mendapatkan nomor ponsel tetapi tidak ada jaminan mungkin itu akan berfungsi hanya di beberapa perangkat. Setelah banyak penelitian saya menemukan hanya tiga solusi tetapi mereka tidak berfungsi di semua perangkat.
Ada alasan berikut mengapa kita tidak mendapatkannya.
1. Perangkat Android dan Kartu SIM baru tidak menyimpan nomor ponsel jika nomor ponsel tidak tersedia di perangkat dan dalam SIM lalu bagaimana mungkin untuk mendapatkan nomor, jika ada kartu SIM lama yang memiliki nomor ponsel maka menggunakan Telephony manager kita bisa mendapatkan nomor lainnya bijaksana itu akan mengembalikan "null" atau "" atau "??????"
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
Catatan: - Saya telah menguji solusi ini di perangkat berikut Moto x, Samsung Tab 4, Samsung S4, Nexus 5 dan Redmi 2 prime tetapi tidak berfungsi setiap kali mengembalikan string kosong sehingga kesimpulannya tidak ada gunanya
Catatan: - Ini juga bukan solusi yang dijamin dan efisien, saya telah menguji solusi ini di banyak perangkat tetapi hanya bekerja di Redmi 2 prime yang merupakan perangkat dual sim. Ini memberi saya dua nomor ponsel yang pertama sudah benar, tetapi yang kedua tidak milik sim kedua saya itu milik beberapa kartu sim lama saya yang tidak saya gunakan.
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();
}
Kesimpulan : - Android tidak memiliki solusi yang dijamin untuk mendapatkan nomor ponsel pengguna secara terprogram.
Saran : - 1. Jika Anda ingin memverifikasi nomor ponsel pengguna kemudian meminta kepada pengguna untuk memberikan nomornya, menggunakan otp Anda dapat memverifikasi itu.
- Jika Anda ingin mengidentifikasi perangkat pengguna, untuk ini Anda dapat dengan mudah mendapatkan nomor IMEI perangkat.
TelephonyManager
bukan solusi yang tepat, karena dalam beberapa kasus angkanya tidak disimpan di SIM. Saya sarankan Anda menggunakan preferensi bersama untuk menyimpan nomor telepon pengguna untuk pertama kalinya aplikasi dibuka dan nomor itu akan digunakan kapan pun Anda butuhkan.
Berikut adalah kombinasi dari solusi yang saya temukan (contoh proyek di sini , jika Anda ingin juga memeriksa isi-otomatis):
nyata
<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 ""
}
}
}
Sedikit kontribusi. Dalam kasus saya, kode meluncurkan pengecualian kesalahan. Saya perlu membuat anotasi agar kode dapat dijalankan dan memperbaiki masalah itu. Di sini saya membiarkan kode ini.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Meskipun dimungkinkan untuk memiliki beberapa akun voicemail, saat menelepon dari nomor Anda sendiri, operator mengarahkan Anda ke voicemail. Jadi, TelephonyManager.getVoiceMailNumber()
atauTelephonyManager.getCompleteVoiceMailNumber()
, tergantung pada rasa yang Anda butuhkan.
Semoga ini membantu.
Tambahkan ketergantungan ini:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Untuk mengambil daftar nomor telepon, gunakan ini:
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
)
Setelah mengetuk dialog layanan putar:
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)
}
}
}
ketika bekerja pada aplikasi keamanan yang diperlukan untuk mendapatkan nomor telepon siapa yang pernah ponsel saya dapat miliki, saya harus melakukan ini; 1. terima Boot selesai dan kemudian coba dapatkan Line1_Number dari telephonyManager yang mengembalikan hasil string. 2. membandingkan hasil String dengan nomor telepon saya sendiri dan jika mereka tidak cocok atau string mengembalikan nol maka, 3. diam-diam mengirim SMS yang berisi hasil string ditambah tanda khusus ke nomor kantor saya. 4. jika pengiriman pesan gagal, mulai layanan dan terus mencoba setelah setiap jam sampai niat tertunda SMS terkirim berhasil kembali. Dengan langkah ini saya bisa mendapatkan nomor orang yang menggunakan ponsel saya yang hilang. tidak masalah jika orang tersebut ditagih.