Làm cách nào để lập trình số điện thoại của thiết bị đang chạy ứng dụng Android của tôi?
Làm cách nào để lập trình số điện thoại của thiết bị đang chạy ứng dụng Android của tôi?
Câu trả lời:
Mã số:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Giấy phép cần thiết:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Theo các bình luận được đánh giá cao, có một vài lưu ý cần chú ý. Điều này có thể trả lại null
hoặc ""
thậm chí "???????"
, và nó có thể trả về một số điện thoại cũ không còn hiệu lực. Nếu bạn muốn một cái gì đó nhận dạng duy nhất thiết bị, bạn nên sử dụng getDeviceId()
thay thế.
null
. Điều đó đang được nói, tôi không biết một câu trả lời tốt hơn.
Không có giải pháp đảm bảo cho vấn đề này vì số điện thoại không được lưu trữ trên tất cả các thẻ SIM hoặc được phát từ mạng đến điện thoại. Điều này đặc biệt đúng ở một số quốc gia yêu cầu xác minh địa chỉ thực, với việc gán số chỉ xảy ra sau đó. Việc gán số điện thoại xảy ra trên mạng - và có thể thay đổi mà không cần thay đổi thẻ SIM hoặc thiết bị (ví dụ: đây là cách hỗ trợ chuyển cổng).
Tôi biết đó là nỗi đau, nhưng rất có thể giải pháp tốt nhất chỉ là yêu cầu người dùng nhập số điện thoại của họ một lần và lưu trữ nó.
Thực sự có một giải pháp thay thế mà bạn có thể muốn xem xét, nếu bạn không thể có được nó thông qua dịch vụ điện thoại.
Kể từ hôm nay, bạn có thể dựa vào một ứng dụng lớn khác Whatsapp, sử dụng AccountManager
. Hàng triệu thiết bị đã cài đặt ứng dụng này và nếu bạn không thể nhận được số điện thoại qua TelephonyManager
, bạn có thể cung cấp cho ứng dụng này một shot.
Quyền:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Mã số:
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);
}
Kiểm tra actype
tài khoản WhatsApp
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Tất nhiên bạn có thể không nhận được nó nếu người dùng không cài đặt WhatsApp, nhưng dù sao cũng đáng để thử. Và hãy nhớ bạn nên luôn luôn yêu cầu người dùng xác nhận.
Như đã đăng trong câu trả lời trước đó của tôi
Sử dụng mã dưới đây:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Trong AndroidManifest.xml, cung cấp quyền sau:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Nhưng hãy nhớ rằng, mã này không phải lúc nào cũng hoạt động, vì số điện thoại di động phụ thuộc vào Thẻ SIM và nhà điều hành mạng / Nhà cung cấp điện thoại di động.
Ngoài ra, hãy thử kiểm tra trong Điện thoại -> Cài đặt -> Giới thiệu -> Nhận dạng điện thoại , Nếu bạn có thể xem Số ở đó, xác suất nhận được số điện thoại từ mã trên cao hơn. Nếu bạn không thể xem số điện thoại trong cài đặt, thì bạn sẽ không thể nhận được thông qua mã này!
Giải pháp đề xuất:
Thực hiện 4 bước trên như một hoạt động một lần trong lần khởi chạy đầu tiên của ứng dụng. Sau này, bất cứ khi nào cần số điện thoại, hãy sử dụng giá trị có sẵn trong tùy chọn chia sẻ.
Vì vậy, đó là cách bạn yêu cầu số điện thoại thông qua API Dịch vụ Play mà không có sự cho phép và hack. Nguồn và ví dụ đầy đủ .
Trong bản build.gradle của bạn (phiên bản 10.2.x trở lên bắt buộc):
compile "com.google.android.gms:play-services-auth:$gms_version"
Trong hoạt động của bạn (mã được đơn giản hóa):
@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;
}
}
Điều này sẽ tạo ra một hộp thoại như thế này:
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;
}
Mã được lấy từ http://www.androidsnippets.com/get-my-phone-number
Có một api Android mới cho phép người dùng chọn số điện thoại của họ mà không cần sự cho phép. Hãy xem tại: 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);
}
Chỉ muốn thêm một chút ở đây để giải thích ở trên trong các câu trả lời ở trên. Mà sẽ tiết kiệm thời gian cho người khác là tốt.
Trong trường hợp của tôi, phương thức này không trả về bất kỳ số điện thoại di động nào, một chuỗi trống đã được trả về. Đó là do trường hợp tôi đã chuyển số của mình trên sim mới. Vì vậy, nếu tôi đi vào Cài đặt> Giới thiệu về Điện thoại> Trạng thái> Số điện thoại của tôi, nó sẽ hiển thị cho tôi "Không xác định".
Đôi khi, bên dưới mã trả về null
hoặc chuỗi trống.
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Với sự cho phép dưới đây
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Có một cách khác bạn sẽ có thể nhận được số điện thoại của mình, tôi đã không kiểm tra điều này trên nhiều thiết bị nhưng mã trên không hoạt động mọi lúc.
Hãy thử mã dưới đây:
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();
}
Bạn sẽ cần thêm hai quyền này.
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Hy vọng điều này sẽ giúp, Cảm ơn!
String s1
sẽ là số điện thoại.
Trước hết, việc người dùng nhận được số điện thoại di động là trái với chính sách Đạo đức, trước đó có thể nhưng hiện tại theo nghiên cứu của tôi, không có giải pháp vững chắc nào cho việc này, bằng cách sử dụng một số mã, có thể nhận được số điện thoại di động nhưng không có gì đảm bảo nó sẽ hoạt động Chỉ trong một vài thiết bị. Sau nhiều nghiên cứu tôi chỉ tìm thấy ba giải pháp nhưng chúng không hoạt động trong tất cả các thiết bị.
Có những lý do sau đây tại sao chúng ta không nhận được.
1.Android thiết bị và Thẻ Sim mới không lưu số điện thoại di động nếu số điện thoại di động không có sẵn trong thiết bị và trong sim thì làm sao có thể lấy số, nếu bất kỳ thẻ sim cũ nào có số di động thì sử dụng trình quản lý Telephony, chúng tôi có thể lấy số khác khôn ngoan nó sẽ trả lại
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
Lưu ý: - Tôi đã thử nghiệm giải pháp này trong các thiết bị sau Moto x, Samsung Tab 4, Samsung S4, Nexus 5 và Redmi 2 nhưng nó không hoạt động mỗi khi nó trả về chuỗi trống nên kết luận là vô dụng
Lưu ý: - Đây cũng không phải là giải pháp được bảo đảm và hiệu quả, tôi đã thử nghiệm giải pháp này trên nhiều thiết bị nhưng nó chỉ hoạt động trong Redmi 2 Prime là thiết bị hai sim, nó cho tôi hai số di động đầu tiên là đúng nhưng số thứ hai thì không thuộc về sim thứ hai của tôi, nó thuộc về một số thẻ sim cũ mà tôi không sử dụng.
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();
}
Kết luận : - Android không có bất kỳ giải pháp bảo đảm nào để có được số điện thoại di động của người dùng theo chương trình.
Gợi ý : - 1. Nếu bạn muốn xác minh số điện thoại di động của người dùng thì hãy yêu cầu người dùng cung cấp số điện thoại của mình, sử dụng otp bạn có thể xác minh số đó.
- Nếu bạn muốn xác định thiết bị của người dùng, vì điều này bạn có thể dễ dàng nhận được số IMEI của thiết bị.
TelephonyManager
không phải là giải pháp phù hợp, vì trong một số trường hợp, số này không được lưu trong SIM. Tôi khuyên bạn nên sử dụng tùy chọn chia sẻ để lưu số điện thoại của người dùng lần đầu tiên mở ứng dụng và số này sẽ được sử dụng bất cứ khi nào bạn cần.
Đây là sự kết hợp của các giải pháp tôi đã tìm thấy (dự án mẫu ở đây , nếu bạn cũng muốn kiểm tra tự động điền):
rõ ràng
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
xây dựng. nâng cấp
implementation "com.google.android.gms:play-services-auth:17.0.0"
ChínhActivity.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 ""
}
}
}
Một chút đóng góp. Trong trường hợp của tôi, mã đã đưa ra một ngoại lệ lỗi. Tôi cần đặt một chú thích rằng mã sẽ được chạy và khắc phục vấn đề đó. Ở đây tôi để mã này.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Mặc dù có thể có nhiều tài khoản thư thoại, nhưng khi gọi từ số của chính bạn, nhà mạng sẽ chuyển bạn đến hộp thư thoại. Vì vậy, TelephonyManager.getVoiceMailNumber()
hoặc TelephonyManager.getCompleteVoiceMailNumber()
, tùy thuộc vào hương vị bạn cần.
Hi vọng điêu nay co ich.
Thêm phụ thuộc này:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Để lấy danh sách số điện thoại, hãy sử dụng:
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
)
Sau khi nhấn vào hộp thoại dịch vụ chơi:
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)
}
}
}
Trong khi làm việc trên một ứng dụng bảo mật cần lấy số điện thoại của ai đó, bao giờ điện thoại của tôi có thể vào tay họ, tôi phải làm điều này; 1. nhận Boot đã hoàn thành và sau đó thử nhận Line1_Number từ telonyManager để trả về kết quả chuỗi. 2. so sánh kết quả Chuỗi với số điện thoại của riêng tôi và nếu chúng không khớp hoặc chuỗi trả về null thì 3. bí mật gửi SMS chứa kết quả chuỗi cộng với một dấu hiệu đặc biệt đến số văn phòng của tôi. 4. nếu gửi tin nhắn thất bại, hãy bắt đầu một dịch vụ và tiếp tục thử sau mỗi giờ cho đến khi tin nhắn SMS đang chờ xử lý trở lại thành công. Với các bước này, tôi có thể nhận được số người sử dụng điện thoại bị mất của mình. nó không quan trọng nếu người đó bị buộc tội.