Android uygulamamı çalıştıran cihazın telefon numarasını programlı olarak nasıl alabilirim?
Android uygulamamı çalıştıran cihazın telefon numarasını programlı olarak nasıl alabilirim?
Yanıtlar:
Kod:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Gerekli İzin:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Son derece değerlendirilen yorumlara göre, dikkat edilmesi gereken birkaç uyarı var. Bu, geri null
veya ""
hatta geri dönebilir "???????"
ve artık geçerli olmayan eski bir telefon numarası döndürebilir. Cihazı benzersiz bir şekilde tanımlayan bir şey istiyorsanız, getDeviceId()
bunun yerine kullanmalısınız .
null
. Bununla birlikte, daha iyi bir cevabın farkında değilim.
Telefon numarası tüm SIM kartlarda fiziksel olarak depolanmadığı veya şebekeden telefona yayınlanmadığı için bu sorunun garantili bir çözümü yoktur. Bu, fiziksel adres doğrulaması gerektiren bazı ülkelerde özellikle doğrudur, ancak daha sonra numara ataması gerçekleşir. Telefon numarası ataması şebekede gerçekleşir - ve SIM kart veya cihaz değiştirilmeden değiştirilebilir (örn. Taşıma bu şekilde desteklenir).
Acı olduğunu biliyorum, ancak büyük olasılıkla en iyi çözüm, kullanıcıdan telefon numarasını bir kez girip saklamasını istemektir.
Telefon hizmetinden alamıyorsanız, dikkate almak isteyebileceğiniz alternatif bir çözüm var.
Bugün itibariyle, başka bir büyük Whatsapp uygulamasına güvenebilirsiniz AccountManager
. Milyonlarca cihazda bu uygulama yüklü ve telefon numarasını alamıyorsanız, bunu deneyebilirsiniz TelephonyManager
.
İzin:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Kod:
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);
}
Kontrol actype
WhatsApp hesabının
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Elbette kullanıcı WhatsApp'ı yüklemediyse alamayabilirsiniz, ancak yine de denemeye değer. Ve her zaman kullanıcıdan onay istemeniz gerektiğini unutmayın.
Önceki cevabımda yayınlandığı gibi
Aşağıdaki kodu kullanın:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
AndroidManifest.xml'de aşağıdaki izni verin:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Ancak, cep telefonu numarası SIM Karta ve Şebeke operatörü / Cep telefonu operatörüne bağlı olduğundan, bu kod her zaman çalışmaz.
Ayrıca, Telefon -> Ayarlar -> Hakkında -> Telefon Kimliği'ni kontrol etmeyi deneyin. Buradaki Numarayı görebiliyorsanız, telefon numarasını yukarıdaki koddan alma olasılığı daha yüksektir. Telefon numarasını ayarlarda görüntüleyemiyorsanız, bu kod ile ulaşamazsınız!
Önerilen Geçici Çözüm:
Uygulamanın ilk lansmanı sırasında yukarıdaki 4 adımı tek seferlik etkinlik olarak yapın. Daha sonra, telefon numarası gerektiğinde, paylaşılan tercihte bulunan değeri kullanın.
Böylece Play Services API'sı üzerinden izin ve korsanlık olmadan bir telefon numarası talep edersiniz. Kaynak ve Tam örnek .
Build.gradle dosyasında (sürüm 10.2.x ve üstü gerekir):
compile "com.google.android.gms:play-services-auth:$gms_version"
Etkinliğinizde (kod basitleştirilmiştir):
@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;
}
}
Bu, aşağıdaki gibi bir iletişim kutusu oluşturur:
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 adresinden alınan kod
Kullanıcının izin gerektirmeden telefon numaralarını seçmesine izin veren yeni bir Android API'si var. Şuraya göz atın: 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);
}
Yukarıdaki cevaplardaki yukarıdaki açıklamalara biraz eklemek istiyorum. Bu da başkaları için zaman kazandıracak.
Benim durumumda bu yöntem herhangi bir cep telefonu numarası döndürmedi, boş bir dize döndürüldü. Numaramı yeni sim'e taşımıştım. Bu yüzden Ayarlar> Telefon Hakkında> Durum> Telefon Numaram bölümüne girersem bana "Bilinmeyen" gösterir.
Bazen, aşağıdaki kod döndürür null
veya boş dize.
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Aşağıdaki izinle
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Telefon numaranızı almanın başka bir yolu var, bunu birden fazla cihazda test etmedim, ancak yukarıdaki kod her seferinde çalışmıyor.
Aşağıdaki kodu deneyin:
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();
}
Bu iki izni eklemeniz gerekecek.
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Umarım bu yardımcı olur, teşekkürler!
String s1
telefon numarası olacaktır.
Öncelikle kullanıcılara cep telefonu numarası Etik politikasına aykırı, daha önce mümkün oldu ama şimdi araştırmamıza göre bunun için sağlam bir çözüm yok, Bazı kodları kullanarak cep telefonu numarası almak mümkün ama hiçbir garanti işe yaramayabilir sadece birkaç cihazda. Çok fazla araştırmadan sonra sadece üç çözüm buldum ama tüm cihazlarda çalışmıyorlar.
Aşağıdaki nedenleri alamıyoruz.
1.Android cihazı ve yeni Sim Kart, cep telefonu numarası cep telefonunda mevcut değilse cep telefonu numarasını kaydetmez ve daha sonra numarayı almak nasıl mümkün olur, cep telefonu numarasına sahip herhangi bir eski sim kartı daha sonra Telefon yöneticisini kullanarak diğer numarayı alabiliriz akıllıca "null" veya "" veya "??????"
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
Not: - Bu çözümü aşağıdaki cihazda test ettim Moto x, Samsung Tab 4, Samsung S4, Nexus 5 ve Redmi 2 prime ancak boş dizeyi her döndürdüğünde çalışmıyor, bu nedenle sonuç işe yaramaz
Not: - Bu aynı zamanda garantili ve verimli bir çözüm değil, bu çözümü birçok cihazda test ettim, ancak sadece çift sim cihazı olan Redmi 2 prime'da çalıştı, ilk önce doğru olan iki cep telefonu numarası verdi ancak ikincisi değil benim ikinci sim aittir benim kullanmadığım bazı eski sim kart aittir.
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();
}
Sonuç : - Android, kullanıcının cep numarasını programlı olarak almak için herhangi bir garantili çözüme sahip değildir.
Öneri : - 1. Eğer kullanıcının cep telefonu numarasını doğrulamak istiyorsanız o zaman kullanıcıya onun numarasını vermesini isteyin, otp kullanarak bunu doğrulayabilirsiniz.
- Kullanıcının cihazını tanımlamak istiyorsanız, bunun için cihaz IMEI numarasını kolayca alabilirsiniz.
TelephonyManager
doğru çözüm değildir, çünkü bazı durumlarda numara SIM'de saklanmaz. Kullanıcının telefon numarasını uygulamanın ilk açılışında saklamak için paylaşılan tercihi kullanmanızı ve numarayı istediğiniz zaman kullanacağınızı öneririm.
Bulduğum çözümlerin bir kombinasyonu ( otomatik doldurmayı da kontrol etmek istiyorsanız, burada örnek proje ):
belirgin
<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 ""
}
}
}
Küçük bir katkı. Benim durumumda, kod bir hata istisnası başlattı. Kod çalıştırmak ve bu sorunu düzeltmek için bir açıklama koymak gerekir. İşte bu kodu izin.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Birden fazla sesli posta hesabınızın olması mümkün olsa da, kendi numaranızdan arama yaparken operatörler sizi sesli postaya yönlendirir. Yani, TelephonyManager.getVoiceMailNumber()
veya TelephonyManager.getCompleteVoiceMailNumber()
ihtiyacınız olan lezzete bağlı olarak.
Bu yardımcı olur umarım.
Bu bağımlılığı ekleyin:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Telefon numarası listesini getirmek için şunu kullanın:
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
)
Play hizmetleri iletişim kutusuna dokunduktan sonra:
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)
}
}
}
telefonumun ellerine geçebileceği telefon numarasını almak için gereken bir güvenlik uygulaması üzerinde çalışırken, bunu yapmak zorunda kaldım; 1. Önyükleme işlemini tamamlayın ve ardından dize sonucu döndüren telephonyManager'dan Line1_Number almayı deneyin. 2. Dize sonucunu kendi telefon numaram ile karşılaştırın ve eşleşmiyorsa veya dize null döndürürse, 3. gizlice dize sonucunu ve ofis numarama özel bir işaret içeren bir SMS gönderin. 4. mesaj gönderme başarısız olursa, bir hizmet başlatın ve gönderilen SMS bekleyen amaç başarılı bir şekilde dönene kadar her saat sonra denemeye devam edin. Bu adımlarla kayıp telefonumu kullanan kişinin numarasını alabilirdim. kişinin ücret alması önemli değildir.