카테고리 보관물: Android

Android

프로그래밍 방식으로 Android 전화의 전화 번호를 얻습니다. 기기의 전화 번호를 프로그래밍 방식으로 얻으려면

내 안드로이드 앱을 실행하는 기기의 전화 번호를 프로그래밍 방식으로 얻으려면 어떻게해야합니까?



답변

암호:

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

필요한 권한 :

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

주의 사항 :

높게 평가 된 의견에 따르면, 알아야 할 몇 가지주의 사항이 있습니다. 이것은 반환 할 수 있습니다 null또는 ""심지어 "???????", 그것은 더 이상 유효하지 오래된 전화 번호를 반환 할 수 있습니다. 장치를 고유하게 식별하는 것을 원한다면 getDeviceId()대신 사용해야 합니다.


답변

전화 번호가 모든 SIM 카드에 물리적으로 저장되거나 네트워크에서 전화로 브로드 캐스트되지 않기 때문에이 문제에 대한 해결책은 보장되지 않습니다. 이것은 물리적 주소 확인이 필요한 일부 국가에서 특히 그렇습니다. 이후에 번호 할당이 이루어집니다. 전화 번호 할당은 네트워크에서 이루어지며 SIM 카드 나 장치를 변경하지 않고도 변경할 수 있습니다 (예 : 포팅이 지원되는 방식).

나는 그것이 고통이라는 것을 알고 있지만, 가장 좋은 해결책은 사용자에게 전화 번호를 한 번 입력하여 저장하도록 요청하는 것입니다.


답변

업데이트 : Whatsapp이 전화 번호를 계정 이름으로 노출하는 것을 중지했기 때문에이 답변을 더 이상 사용할 수 없으므로이 답변을 무시하십시오.

전화 서비스를 통해 얻을 수없는 경우 실제로 고려해야 할 대체 솔루션이 있습니다.

현재로서는를 사용하여 다른 큰 응용 프로그램 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);
}

actypeWhatsApp 계정 확인

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를 확인하십시오. 에서 확인하십시오. 번호를 볼 수 있으면 위 코드에서 전화 번호를 얻을 확률이 높습니다. 설정에서 전화 번호를 볼 수 없으면이 코드를 통해 얻을 수 없습니다!

제안 된 해결 방법 :

  1. 사용자의 전화 번호를 수동 입력으로 얻습니다.
  2. SMS를 통해 사용자의 휴대폰 번호로 코드를 보냅니다.
  3. 전화 번호를 확인하기 위해 코드를 입력하도록 요청하십시오.
  4. 번호를 sharedpreference에 저장하십시오.

앱을 처음 시작할 때 위의 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);
}