รับหมายเลขโทรศัพท์ของโทรศัพท์ Android โดยทางโปรแกรม


443

ฉันจะรับหมายเลขโทรศัพท์ของอุปกรณ์ที่ใช้แอพ Android ของฉันโดยทางโปรแกรมได้อย่างไร


มันเป็นไปไม่ได้ยกเว้นถ้าคุณป้อนด้วยตัวเอง หมายเลขโทรศัพท์ไม่ทราบจากโทรศัพท์มือถือหรือซิมเท่านั้นโดยเครือข่าย ....
tomsoft

3
@tomsoft ลองคิดดูสิ ... แอพอย่าง Facebook ยืนยันหมายเลขโทรศัพท์ของคุณโดยอัตโนมัติอย่างน่าอัศจรรย์ได้อย่างไร .. ?
Eddie Hart

1
@tomsoft ไม่, โดยส่วนใหญ่แล้วมันไม่ได้ขอหมายเลขโทรศัพท์ของคุณ, หรือถ้ามันเป็นเช่นนั้นกล่องก็จะถูกเติมล่วงหน้า
Eddie Hart

1
@tomsoft ดีฉันสมัคร Facebook วันอื่นและมันไม่ขอหมายเลขของฉันเมื่อมันส่งข้อความถึงฉัน ลองมัน. ;)
Eddie Hart

1
@EddieHart ทำเช่นนั้นและฉันถูกถามหมายเลขโทรศัพท์ของฉัน ดังนั้นนี่เป็นการยืนยันว่าโดยทั่วไปแล้วจะไม่สามารถเข้าถึงได้และผู้ให้บริการบางรายอาจเพิ่มข้อมูลนี้ในการตั้งค่า แต่นี่ไม่ใช่คุณสมบัติมาตรฐานของ GMS
tomsoft

คำตอบ:


484

รหัส:

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

สิทธิ์ที่จำเป็น:

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

คำเตือน:

จากความคิดเห็นที่มีผู้โหวตสูงมีข้อควรระวังเล็กน้อยที่ควรระวัง สิ่งนี้สามารถส่งคืนnullหรือ""หรือแม้กระทั่ง"???????"และสามารถส่งคืนหมายเลขโทรศัพท์เก่าที่ไม่สามารถใช้งานได้อีกต่อไป หากคุณต้องการสิ่งที่ระบุอุปกรณ์โดยเฉพาะคุณควรใช้getDeviceId()แทน


150
จริงๆแล้วไม่สมบูรณ์แบบ ครั้งล่าสุดที่ฉันลองใช้วิธีนี้จะรายงานหมายเลขโทรศัพท์ที่โทรศัพท์ของฉันมีอยู่ก่อนที่หมายเลขโทรศัพท์เก่าของฉันจะถูกย้ายไปที่ อาจเป็นเช่นนั้นเนื่องจากแอปการตั้งค่ายังคงแสดงหมายเลขที่หมดอายุ nullนอกจากนี้ยังมีรายงานว่าบางซิมทำให้เกิดวิธีการนี้เพื่อผลตอบแทน ที่ถูกกล่าวว่าฉันไม่ได้ตระหนักถึงคำตอบที่ดีกว่า
CommonsWare

4
มาร์คถูกต้อง หากความตั้งใจที่จะใช้สิ่งที่ระบุโทรศัพท์โดยเฉพาะฉันจะใช้ getDeviceId () ซึ่งจะส่งคืน IMEA สำหรับ GSM
Alex Volovoy

15
(ฉันคิดว่าคุณหมายถึง IMEI ... ?)
ChaimKut

23
ฉันทดสอบบน Nexus One ด้วย Android OS 2.2 และส่งคืน null
Omar Rehman

43
นักพัฒนาอาจคิดว่ามันเป็นคำตอบที่สมบูรณ์แบบโดยพิจารณาจากการนับคะแนน ควรเพิ่มหมายเหตุเพื่อเตือนผู้พัฒนาว่าวิธีนี้จะไม่ให้หมายเลขโทรศัพท์เสมอ
Habeeb Perwad

151

ไม่มีวิธีแก้ปัญหาที่รับประกันได้สำหรับปัญหานี้เนื่องจากหมายเลขโทรศัพท์ไม่ได้เก็บไว้ในซิมการ์ดทั้งหมดหรือออกอากาศจากเครือข่ายไปยังโทรศัพท์ นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งในบางประเทศที่ต้องการการยืนยันที่อยู่จริงด้วยการกำหนดหมายเลขที่จะเกิดขึ้นหลังจากนั้น การกำหนดหมายเลขโทรศัพท์เกิดขึ้นในเครือข่าย - และสามารถเปลี่ยนแปลงได้โดยไม่ต้องเปลี่ยนซิมการ์ดหรืออุปกรณ์ (เช่นนี่เป็นวิธีการที่พอร์ตรองรับ)

ฉันรู้ว่ามันเจ็บปวด แต่ส่วนใหญ่ทางออกที่ดีที่สุดคือขอให้ผู้ใช้ป้อนหมายเลขโทรศัพท์หนึ่งครั้งและเก็บไว้


18
ในการตรวจสอบหมายเลขที่ถ่ายคุณสามารถส่ง SMS (มีรหัส) ไปยังหมายเลขและควบคุมการตอบสนองโดยการใส่ผู้ฟังลงใน "android.provider.Telephony.SMS_RECEIVED" ด้วยวิธีนี้คุณสามารถตรวจสอบให้แน่ใจว่าจำนวนถูกต้องและทำงานได้ดี
Hossein Shahdoost

1
โซลูชันที่สร้างสรรค์ แต่คุณอาจต้องการให้ผู้ใช้ทราบว่าคุณกำลังดำเนินการในกรณีที่พวกเขาถูกเรียกเก็บเงินสำหรับสิ่งนั้น
นอร์แมน H

3
มีผู้ให้บริการรายใดที่คิดค่ารับข้อความอย่างง่ายหรือไม่!
ThiefMaster

9
ใช่แล้ว ก่อนที่ฉันจะเพิ่มการส่งข้อความไปยังแผนของฉันฉันถูกเรียกเก็บเงิน $ 0.30 ต่อข้อความที่ได้รับ Rogers ในแคนาดา
John Kroetch

44

อัปเดต: คำตอบนี้ไม่สามารถใช้งานได้อีกต่อไปเนื่องจาก 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);
}

ตรวจสอบactypeบัญชี WhatsApp

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

แน่นอนคุณอาจไม่ได้รับหากผู้ใช้ไม่ได้ติดตั้ง WhatsApp แต่มันคุ้มค่าที่จะลอง และจำไว้ว่าคุณควรขอให้ผู้ใช้ยืนยันเสมอ


1
ฉันเพิ่งเห็นสิ่งนี้ในวันนี้เมื่อฉันยุ่งกับบัญชี มันไม่ดีเลยที่ตัวเลขจะถูกเปิดเผยเช่นนั้น แน่นอนว่าคุณต้องได้รับอนุญาตจาก GET_ACCOUNTS และ ณ จุดนั้นผู้ใช้อาจไม่สนใจว่าแอปใดมีสิทธิ์
jargetz

9
โซลูชันนี้ล้าสมัย Whatsapp ไม่ได้บันทึกหมายเลขโทรศัพท์ในชื่อ acount อีกต่อไปคุณรู้หรือไม่ว่า Whatsapp นั้นบันทึกหมายเลขโทรศัพท์ไว้ที่ไหนหลังจากอัพเดตใหม่
Cohelad

@Cohelad ขอบคุณสำหรับการปรับปรุงฉันฉันจะมีการตรวจสอบในภายหลังและข้ามคำตอบนี้หลังจากการยืนยันในขณะเดียวกันฉันไม่มีความคิดที่พวกเขาจะบันทึกหมายเลข
Chor Wai Chun

3
แต่ Viber เปิดเผยตัวเลข! com.viber.voip.account
xnagyg

32

ดังที่โพสต์ในคำตอบก่อนหน้าของฉัน

ใช้รหัสด้านล่าง:

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

ใน AndroidManifest.xml ให้สิทธิ์ต่อไปนี้:

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

แต่โปรดจำไว้ว่ารหัสนี้ใช้ไม่ได้เนื่องจากหมายเลขโทรศัพท์มือถือขึ้นอยู่กับซิมการ์ดและผู้ให้บริการเครือข่าย / ผู้ให้บริการโทรศัพท์มือถือ

และลองตรวจสอบในโทรศัพท์ -> การตั้งค่า -> เกี่ยวกับ -> ข้อมูลระบุตัวตนของโทรศัพท์หากคุณสามารถดูหมายเลขได้โอกาสในการรับหมายเลขโทรศัพท์จากรหัสด้านบนจะสูงกว่า หากคุณไม่สามารถดูหมายเลขโทรศัพท์ในการตั้งค่าคุณจะไม่สามารถรับรหัสนี้ได้!

วิธีแก้ปัญหาที่แนะนำ:

  1. รับหมายเลขโทรศัพท์ของผู้ใช้เป็นอินพุตด้วยตนเองจากผู้ใช้
  2. ส่งรหัสไปยังหมายเลขโทรศัพท์มือถือของผู้ใช้ผ่าน SMS
  3. ขอให้ผู้ใช้ป้อนรหัสเพื่อยืนยันหมายเลขโทรศัพท์
  4. บันทึกหมายเลขใน sharedpreference

ทำ 4 ขั้นตอนข้างต้นเป็นกิจกรรมครั้งเดียวระหว่างการเปิดตัวครั้งแรกของแอป ต่อมาเมื่อใดก็ตามที่ต้องการหมายเลขโทรศัพท์ให้ใช้ค่าที่มีอยู่ในการตั้งค่าที่ใช้ร่วมกัน


คำตอบนี้ครอบคลุมถึงปัจจัยทั้งหมดมันควรจะเป็นที่ยอมรับอย่างหนึ่ง =)
Slava Fomin II

ฉันจะรับทั้งสองหมายเลขมือถือได้อย่างไรถ้ามีซิมคู่ใช้งานบนโทรศัพท์ ด้วยรหัสข้างต้น สำหรับซิมเดียวมันทำงานได้ดี
Amrit Chakradhari

26

นั่นคือวิธีที่คุณร้องขอหมายเลขโทรศัพท์ผ่าน Play Services 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;
    }
}

สิ่งนี้จะสร้างกล่องโต้ตอบเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่


2
คำแนะนำขอแสดงหมายเลขโทรศัพท์จากบัญชีอีเมลที่เชื่อมต่อกับโทรศัพท์มันจะแสดงแบบหล่นลงแม้ว่าจะไม่มีซิมในอุปกรณ์
Ari

กล่องโต้ตอบจะแสดงตัวเลขหลายตัวในขณะที่มีเพียงหนึ่ง SIM ได้อย่างไร สำหรับฉันมันแสดงหมายเลข 5 : / :)
CGR

เราจะเลือกหมายเลขโทรศัพท์แรกโดยอัตโนมัติใน Android ได้อย่างไร
Noorul

13
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


@JaredBurrows เนื่องจาก "s.substring (2)"
Cookie Monster

1
มันไม่ทำงานสำหรับฉัน ฉันได้รับค่า NULL (พระอาทิตย์ขึ้นซิมการ์ด, สวิตเซอร์แลนด์)
e- ธรรมชาติ

ลิงก์ของคุณเสีย
Ümañgßürmån

11

มี 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);
} 

นี้ต้อง Firebase
Vlad

@ วลาดไม่ไม่ ต้องใช้บริการ Google Play ที่มาพร้อมกับอุปกรณ์ส่วนใหญ่เท่านั้น อ้างจาก blogpost: 'ก่อนที่คุณจะเริ่มต้นคุณจะต้องสร้างและทดสอบว่านี่คืออุปกรณ์ที่มีหมายเลขโทรศัพท์ที่สามารถรับ SMS และเรียกใช้บริการ Google Play 10.2.x และสูงกว่า'
Wirling

9

เพียงแค่ต้องการเพิ่มบิตที่นี่เพื่อคำอธิบายข้างต้นในคำตอบข้างต้น ซึ่งจะช่วยประหยัดเวลาให้กับผู้อื่นเช่นกัน

ในกรณีของฉันวิธีนี้ไม่ได้ส่งคืนหมายเลขโทรศัพท์มือถือใด ๆ สตริงว่างถูกส่งกลับ เป็นเพราะกรณีที่ฉันได้ย้ายหมายเลขของฉันในซิมใหม่ ดังนั้นหากฉันไปที่การตั้งค่า> เกี่ยวกับโทรศัพท์> สถานะ> หมายเลขโทรศัพท์ของฉันมันจะแสดง "ไม่ทราบ"


ฉันยังเงื่อนไขนี้คืออะไร? บริการข้ามแดนอัตโนมัติ? หรือบางทีซิมการ์ดก็ไม่ได้เก็บเบอร์ไว้ในนั้น
Alexandre Marcondes

8

บางครั้งการส่งคืนโค้ดด้านล่าง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" />

หวังว่าจะช่วยได้ขอบคุณ!


ฉันขอโปรด: ในตัวอย่างที่สองซึ่งเป็นจำนวนเซลล์?
iOSAndroidWindowsMobileAppsDev

1
มูลค่าของString s1จะเป็นหมายเลขโทรศัพท์
activesince93

รหัสนี้ใช้ไม่ได้สำหรับฉัน (ข้อมูลโค้ดสุดท้ายของคุณ) ส่งคืนสตริงว่าง
Kristy Welsh

กรุณาอธิบายคำตอบของคุณ หมายเลขถูกเก็บไว้ที่ไหนและมีหมายเลขอย่างไร? ขึ้นอยู่กับอะไร
not2qubit

3
@ not2qubit ฉันคิดว่านี่เป็นการเข้าถึงการติดต่อด้วยตนเองในแอปผู้ติดต่อ
Samplasion

4

นี่เป็นคำตอบที่ง่ายกว่านี้:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}

3

ก่อนอื่นการรับหมายเลขโทรศัพท์มือถือของผู้ใช้นั้นขัดต่อนโยบายจริยธรรมก่อนหน้านี้มันเป็นไปได้ แต่ตอนนี้ตามการวิจัยของฉันไม่มีวิธีแก้ปัญหาที่มั่นคงสำหรับการใช้รหัสบางอย่างมันเป็นไปได้ที่จะได้รับหมายเลขโทรศัพท์มือถือ เฉพาะในอุปกรณ์น้อย หลังจากการวิจัยจำนวนมากฉันพบวิธีแก้ปัญหาเพียงสามข้อเท่านั้น แต่อุปกรณ์เหล่านั้นไม่ทำงานในทุกอุปกรณ์

มีเหตุผลดังต่อไปนี้ทำไมเราไม่ได้รับ

1. อุปกรณ์ Android และซิมการ์ดใหม่ไม่ได้จัดเก็บหมายเลขโทรศัพท์มือถือหากหมายเลขโทรศัพท์ไม่สามารถใช้งานได้ในอุปกรณ์และในซิมแล้วจะสามารถรับหมายเลขได้อย่างไรหากซิมการ์ดเก่าที่มีหมายเลขโทรศัพท์มือถือแล้วใช้ผู้จัดการโทรศัพท์ ฉลาดก็จะส่งคืน“ โมฆะ” หรือ“” หรือ“ ??????”

<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 prime แต่มันไม่ทำงานทุกครั้งที่ส่งคืนสตริงว่างเปล่าดังนั้นข้อสรุปจึงไม่มีประโยชน์

  1. วิธีการนี้ใช้งานได้เฉพาะใน Redmi 2 prime เท่านั้น แต่ด้วยเหตุนี้จำเป็นต้องเพิ่มสิทธิ์ในการอ่านของผู้ติดต่อในรายการ

หมายเหตุ: - นี่ไม่ใช่โซลูชันที่รับประกันและมีประสิทธิภาพฉันได้ทดสอบโซลูชันนี้ในอุปกรณ์จำนวนมาก แต่ใช้งานได้เฉพาะใน Redmi 2 prime ซึ่งเป็นอุปกรณ์สองซิมมันให้ฉันหมายเลขโทรศัพท์สองหมายเลขแรกหนึ่งถูกต้อง แต่อันที่สองไม่ใช่ เป็นของซิมที่สองของฉันมันเป็นของซิมการ์ดเก่า ๆ ที่ฉันไม่ได้ใช้

 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. ในการวิจัยของฉันฉันได้พบก่อนหน้านี้มันเป็นไปได้ที่จะได้รับหมายเลขโทรศัพท์มือถือโดยใช้บัญชี WhatsApp แต่ตอนนี้รุ่น Whatsapp ใหม่ไม่ได้จัดเก็บหมายเลขโทรศัพท์มือถือของผู้ใช้

สรุป : - Android ไม่มีโซลูชันที่รับประกันว่าจะได้รับหมายเลขโทรศัพท์มือถือของผู้ใช้โดยทางโปรแกรม

คำแนะนำ : - 1. หากคุณต้องการตรวจสอบหมายเลขโทรศัพท์มือถือของผู้ใช้จากนั้นขอให้ผู้ใช้แจ้งหมายเลขโทรศัพท์โดยใช้ otp คุณสามารถตรวจสอบได้

  1. หากคุณต้องการระบุอุปกรณ์ของผู้ใช้คุณสามารถรับหมายเลข IMEI ของอุปกรณ์ได้อย่างง่ายดาย

2

TelephonyManagerไม่ใช่วิธีการแก้ปัญหาที่ถูกต้องเพราะในบางกรณีหมายเลขจะไม่ถูกเก็บไว้ใน SIM ฉันขอแนะนำให้คุณใช้การตั้งค่าที่ใช้ร่วมกันเพื่อเก็บหมายเลขโทรศัพท์ของผู้ใช้เป็นครั้งแรกที่มีการเปิดแอปพลิเคชันและจะใช้หมายเลขนั้นทุกครั้งที่คุณต้องการ


1
แต่วิธีนี้มีข้อผิดพลาดง่ายผู้ใช้สามารถป้อนหมายเลขผิด
Zohra Khan

3
ใช่เพื่อจุดประสงค์นี้ฉันใช้ข้อความตัวอักษรเมื่อผู้ใช้ป้อนหมายเลขดังนั้นจาก SmsManager ข้อความของแอปเองและด้วยวิธีนี้เราสามารถใช้ smsReciever เพื่อรับหมายเลขเดิม
Naveed Ahmad

1
ฉันมีคำถามอีกหนึ่งข้อ .. ด้วยวิธีนี้จะมีการคิดค่าบริการ SMS จากผู้ใช้ (หากไม่ใช่หมายเลขโทรฟรี) .. มีวิธีอื่นที่ฉันสามารถรับโทรศัพท์ได้หรือไม่?
Zohra Khan

ใช่แน่นอนจะมีการคิดค่าบริการสำหรับ SMS นั้นหากหมายเลขนั้นไม่ใช่หมายเลขโทรฟรี
อาเหม็ด Naveed

ไม่ฉันคิดว่าไม่มีวิธีดังกล่าวหากไม่มี TelephonyManager จนถึงตอนนี้ และฉันชี้ให้เห็นปัญหาของ TelephoneManager ในคำตอบของฉัน
อาเหม็ด Naveed

2

นี่คือการผสมผสานของโซลูชั่นที่ฉันได้พบ (ตัวอย่างโครงการที่นี่หากคุณต้องการตรวจสอบการป้อนอัตโนมัติด้วย):

ประจักษ์

    <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 ""
        }
    }
}

โปรดดูความคิดเห็นเกี่ยวกับคำตอบนี้stackoverflow.com/a/48210130/5457916ก่อนที่จะใช้วิธีการนี้
humble_wolf

ลิงค์ที่คุณให้ไว้เป็นเพียงส่วนหนึ่งของสิ่งที่ฉันทำที่นี่ ที่นี่ฉันพยายามเติมตัวเองเป็นครั้งแรกโดยอัตโนมัติ และมีทางเลือกสำหรับสิ่งนี้
นักพัฒนา android

ฉันรู้ว่าคุณคำตอบของคุณดีมากและไม่ถูกต้องในทุกแง่มุมฉันแค่อยากให้ผู้อ่านได้ตระหนักถึงเงื่อนไขที่มาพร้อมกับวิธีนี้เช่นสามารถใส่จำนวนที่เกี่ยวข้องกับบัญชี Google ของคุณ ฯลฯ ที่กล่าวถึงในความคิดเห็นที่นั่น
humble_wolf

ฉันยังคงชอบสิ่งที่ฉันเขียน ขออภัย
นักพัฒนาหุ่นยนต์

1

ผลงานเล็กน้อย ในกรณีของฉันรหัสเปิดตัวข้อผิดพลาด ฉันจำเป็นต้องใส่คำอธิบายประกอบที่จะเรียกใช้รหัสและแก้ไขปัญหานั้น ที่นี่ฉันขอรหัสนี้

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}

0

แม้ว่าจะเป็นไปได้ที่จะมีบัญชีข้อความเสียงหลายบัญชี แต่เมื่อโทรจากหมายเลขของคุณเองผู้ให้บริการจะนำคุณไปยังข้อความเสียง ดังนั้นTelephonyManager.getVoiceMailNumber()หรือTelephonyManager.getCompleteVoiceMailNumber()ขึ้นอยู่กับรสชาติที่คุณต้องการ

หวังว่านี่จะช่วยได้


5
ไม่มีฟังก์ชั่น "getCompleteVoiceMailNumber" รวมทั้ง getVoiceMailNumber () จะส่งคืนตัวเลขที่แตกต่างจากหมายเลขจริงของโทรศัพท์
นักพัฒนา android

นี่เป็นเคล็ดลับที่ใช้งานได้กับผู้ให้บริการโทรศัพท์มือถือเพียงไม่กี่รายในโลก แต่ในทางเทคนิคอาจเป็นวิธีแก้ปัญหา
technik

0

เพิ่มการพึ่งพานี้: 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)
        }
    }
}

-6

ในขณะที่ทำงานกับแอพรักษาความปลอดภัยซึ่งต้องการหมายเลขโทรศัพท์ของผู้ที่โทรศัพท์ของฉันอาจเข้ามาอยู่ในมือพวกเขาฉันต้องทำเช่นนี้ 1. รับ Boot เสร็จสิ้นแล้วลองรับ Line1_Number จาก telephonyManager ซึ่งส่งคืนผลลัพธ์สตริง 2. เปรียบเทียบผลลัพธ์ String กับหมายเลขโทรศัพท์ของฉันเองและหากพวกเขาไม่ตรงกันหรือสตริงคืนค่า null แล้ว 3. ส่ง SMS ที่มีสตริงและแอบแฝงเครื่องหมายพิเศษไปยังหมายเลขสำนักงานของฉัน 4. หากการส่งข้อความล้มเหลวให้เริ่มบริการและพยายามต่อไปทุก ๆ ชั่วโมงจนกว่าความตั้งใจรอส่ง SMS จะส่งกลับสำเร็จ ด้วยขั้นตอนนี้ฉันสามารถรับจำนวนผู้ใช้โทรศัพท์ที่หายไป ไม่สำคัญว่าบุคคลนั้นจะถูกเรียกเก็บเงินหรือไม่


ทำไมต้องลงคะแนน
humble_wolf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.