【问题标题】:Get my phone number in android在android中获取我的电话号码
【发布时间】:2015-10-23 01:06:03
【问题描述】:

如何在 Android 中获取我的电话号码? 当我使用:

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

并使用:

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

它返回null,为什么?

【问题讨论】:

标签: android


【解决方案1】:

如果您调用的函数返回null,则表示您的电话号码未在您的联系人列表中注册。

如果您只需要一个唯一号码而不是电话号码,您可以使用 sim 卡的序列号:

    TelephonyManager telemamanger = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    String getSimSerialNumber = telemamanger.getSimSerialNumber();  

【讨论】:

  • 那你怎么办?有什么方法可以通过 SIM 卡序列号获取电话号码?
  • “手机没有注册手机号”是什么意思?如何在手机中注册电话号码?请解释一下。
【解决方案2】:

Robi Code 适合我,只要输入 if !null 这样如果电话号码为空,用户可以自己填写电话号码。

editTextPhoneNumber = (EditText) findViewById(R.id.editTextPhoneNumber);
TelephonyManager tMgr;
tMgr= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
if (mPhoneNumber != null){
editTextPhoneNumber.setText(mPhoneNumber);
}

【讨论】:

    【解决方案3】:

    方法一:

    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;
            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" />
    

    希望这会有所帮助, 谢谢!

    【讨论】:

      【解决方案4】:
      private String getMyPhoneNumber(){
          TelephonyManager mTelephonyMgr;
          mTelephonyMgr = (TelephonyManager)
              getSystemService(Context.TELEPHONY_SERVICE); 
          return mTelephonyMgr.getLine1Number();
      }
      
      private String getMy10DigitPhoneNumber(){
          String s = getMyPhoneNumber();
          return s.substring(2);
      }
      

      【讨论】:

      • 这个答案和操作问题有什么区别?
      • @Robi 您的代码没有帮助,因为如果您执行“return mTelephonyMgr.getLine1Number();”如果号码未存储在电话上,则可能返回 null,因此在下一个方法中“return s.substring(2);”代码将中断....
      【解决方案5】:

      回复here

      使用下面的代码:

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

      在 AndroidManifest.xml 中,赋予以下权限:

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

      但请记住,此代码并不总是有效,因为手机号码取决于 SIM 卡和网络运营商/手机运营商。

      另外,请尝试检查电话--> 设置--> 关于--> 电话身份,如果您能够在此处查看号码,则概率从上面的代码中获取电话号码更高。如果您无法在设置中查看电话号码,那么您将无法通过此代码获取!

      建议的解决方法:

      1. 获取用户的电话号码作为用户的手动输入。
      2. 通过短信向用户的手机号码发送验证码。
      3. 要求用户输入验证码以确认电话号码。
      4. 将号码保存在 sharedpreference 中。

      在应用首次启动期间,将上述 4 个步骤作为一次性活动执行。稍后,每当需要电话号码时,请使用共享首选项中可用的值。

      【讨论】:

      • 如果手机上有双卡,我如何获得两个手机号码。用上面的代码。对于单 sim 它工作正常。
      【解决方案6】:

      来自documentation

      返回第 1 行的电话号码字符串,例如 GSM 电话的 MSISDN。如果不可用,则返回 null。

      所以你做的一切都是正确的,但是没有存储电话号码。

      如果你得到null,你可以显示一些东西让用户自己输入电话号码。

      【讨论】:

      • 如果电话号码没有存储在 SIM 卡或设备本身上,则无法通过其他任何方式获取电话号码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多