내 안드로이드 앱을 실행하는 기기의 전화 번호를 프로그래밍 방식으로 얻으려면 어떻게해야합니까?
내 안드로이드 앱을 실행하는 기기의 전화 번호를 프로그래밍 방식으로 얻으려면 어떻게해야합니까?
답변:
암호:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
필요한 권한 :
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
높게 평가 된 의견에 따르면, 알아야 할 몇 가지주의 사항이 있습니다. 이것은 반환 할 수 있습니다 null
또는 ""
심지어 "???????"
, 그것은 더 이상 유효하지 오래된 전화 번호를 반환 할 수 있습니다. 장치를 고유하게 식별하는 것을 원한다면 getDeviceId()
대신 사용해야 합니다.
null
. 나는 더 나은 대답을 모른다.
전화 번호가 모든 SIM 카드에 물리적으로 저장되거나 네트워크에서 전화로 브로드 캐스트되지 않기 때문에이 문제에 대한 해결책은 보장되지 않습니다. 이것은 물리적 주소 확인이 필요한 일부 국가에서 특히 그렇습니다. 이후에 번호 할당이 이루어집니다. 전화 번호 할당은 네트워크에서 이루어지며 SIM 카드 나 장치를 변경하지 않고도 변경할 수 있습니다 (예 : 포팅이 지원되는 방식).
나는 그것이 고통이라는 것을 알고 있지만, 가장 좋은 해결책은 사용자에게 전화 번호를 한 번 입력하여 저장하도록 요청하는 것입니다.
전화 서비스를 통해 얻을 수없는 경우 실제로 고려해야 할 대체 솔루션이 있습니다.
현재로서는를 사용하여 다른 큰 응용 프로그램 Whatsapp에 의존 할 수 있습니다 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
WhatsApp 계정 확인
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
물론 사용자가 WhatsApp을 설치하지 않았지만 시도해 볼 가치가 있으면 얻을 수 없습니다. 항상 사용자에게 확인을 요청해야합니다.
내에 게시 이전 답변에
아래 코드를 사용하십시오 :
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
AndroidManifest.xml에서 다음 권한을 부여하십시오.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
그러나 휴대 전화 번호는 SIM 카드 및 네트워크 사업자 / 휴대 전화 사업자에 따라 다르므로이 코드가 항상 작동하는 것은 아닙니다.
또한 전화-> 설정-> 정보-> 전화 ID를 확인하십시오. 에서 확인하십시오. 번호를 볼 수 있으면 위 코드에서 전화 번호를 얻을 확률이 높습니다. 설정에서 전화 번호를 볼 수 없으면이 코드를 통해 얻을 수 없습니다!
제안 된 해결 방법 :
앱을 처음 시작할 때 위의 4 단계를 한 번만 수행하십시오. 나중에 전화 번호가 필요할 때마다 공유 기본 설정에서 사용 가능한 값을 사용하십시오.
따라서 권한과 해킹없이 Play 서비스 API를 통해 전화 번호를 요청하는 방법입니다. 소스 및 전체 예 .
build.gradle (버전 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 에서 가져온 코드
사용자가 권한 없이도 전화 번호를 선택할 수있는 새로운 Android API가 있습니다. 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);
}
위의 답변에서 위의 설명에 약간을 추가하고 싶습니다. 다른 사람들도 시간을 절약 할 수 있습니다.
필자의 경우이 방법은 휴대 전화 번호를 반환하지 않았으며 빈 문자열이 반환되었습니다. 내가 새로운 시뮬레이션에 내 번호를 포팅 한 경우 때문입니다. 따라서 설정> 전화 정보> 상태> 내 전화 번호로 이동하면 "알 수 없음"이 표시됩니다.
때로는 아래 코드가 반환 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. 휴대 전화 번호를 휴대 전화 번호를 사용할 수없는 경우 휴대 전화 번호를 가진 휴대 전화 관리자를 사용하여 휴대 전화 번호를 사용할 수있는 경우 안드로이드 번호 및 휴대 전화 번호를 휴대 전화 번호를 사용할 수없는 경우 휴대 전화 번호를 저장하지 않는 다른 SIM 카드 번호 현명하게 "null"또는 ""또는 "??????"를 반환합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
참고 :-Moto x, Samsung Tab 4, Samsung S4, Nexus 5 및 Redmi 2 프라임 장치 에서이 솔루션을 테스트했지만 빈 문자열을 반환 할 때마다 작동하지 않으므로 결론은 쓸모가 없습니다.
참고 :-이것은 또한 보장되고 효율적인 솔루션이 아니며 많은 장치 에서이 솔루션을 테스트했지만 이중 Sim 장치 인 Redmi 2 프라임에서만 작동했습니다. 내 두 번째 sim에 속한다. 내가 사용하지 않는 오래된 sim 카드에 속한다.
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. 사용자의 휴대 전화 번호를 확인하려면 otp를 사용하여 사용자에게 전화 번호를 제공하도록 요청하면 otp를 사용하여 확인할 수 있습니다.
- 사용자의 장치를 식별하려면 장치 IMEI 번호를 쉽게 얻을 수 있습니다.
TelephonyManager
경우에 따라 숫자가 SIM에 저장되지 않기 때문에 올바른 솔루션이 아닙니다. 응용 프로그램을 처음 열 때 사용자의 전화 번호를 저장하려면 공유 기본 설정을 사용해야하며 필요할 때마다 번호가 사용되도록 제안합니다.
다음은 내가 찾은 솔루션의 조합입니다 ( 자동 채우기도 확인하려는 경우 샘플 프로젝트 here ).
명백한
<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. 부팅이 완료된 후 telephonyManager에서 Line1_Number를 가져 와서 문자열 결과를 반환하십시오. 2. 문자열 결과를 내 전화 번호와 비교하고 일치하지 않거나 문자열이 null을 반환하는 경우 3. 문자열 결과와 특수 기호가 포함 된 SMS를 내 사무실 번호로 비밀리에 보냅니다. 4. 메시지 전송에 실패하면 서비스를 시작하고 보낸 SMS 보류 의도가 성공적으로 반환 될 때까지 매 시간마다 계속 시도하십시오. 이 단계를 통해 분실 전화를 사용하는 사람의 수를 알 수있었습니다. 요금이 청구되는지는 중요하지 않습니다.