Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以编程方式获取Android手机的电话号码_Android_Phone Number_Telephonymanager - Fatal编程技术网

以编程方式获取Android手机的电话号码

以编程方式获取Android手机的电话号码,android,phone-number,telephonymanager,Android,Phone Number,Telephonymanager,如何以编程方式获取运行android应用程序的设备的电话号码?代码: TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE); String mPhoneNumber = tMgr.getLine1Number(); 所需权限: <uses-permission android:name="android.permission.READ_PHONE_

如何以编程方式获取运行android应用程序的设备的电话号码?

代码:

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
所需权限:

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

注意事项: 根据投票率高的评论,有几个警告需要注意。这可以返回
null
甚至
”???“
,还可以返回不再有效的过期电话号码。如果您想要唯一标识设备的东西,应该使用
getDeviceId()

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

代码取自

虽然可以有多个语音信箱帐户,但当您使用自己的号码呼叫时,运营商会将您转接到语音信箱。因此,
TelephonyManager.getVoiceMailNumber()
TelephonyManager.getCompleteVoiceMailNumber()
,这取决于您需要的风格


希望这能有所帮助。

由于电话号码不是物理存储在所有SIM卡上,也不是从网络广播到手机,因此无法保证解决此问题。这在一些需要物理地址验证的国家尤其如此,数字分配只能在之后进行。电话号码分配在网络上进行,并且可以在不更改SIM卡或设备的情况下进行更改(例如,这就是支持移植的方式)


我知道这很痛苦,但最有可能的解决办法是让用户输入他/她的电话号码一次并存储它。

这是一个更简单的答案:

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

我只想在上面的答案中添加一点对上述解释的补充。这也会为其他人节省时间

在我的例子中,这个方法没有返回任何手机号码,而是返回了一个空字符串。这是因为我把我的号码移植到了新的sim卡上。因此,如果我进入设置>关于电话>状态>我的电话号码,它会显示我“未知”。

更新:此答案不再可用,因为Whatsapp已停止将电话号码公开为帐户名,请忽略此答案。 如果你无法通过电话服务获得它,实际上你可能需要考虑另一种解决方案。 现在,您可以使用
AccountManager
依赖另一个大型应用程序Whatsapp。数以百万计的设备安装了此应用程序,如果您无法通过
TelephonyManager
获取电话号码,您可以试一试

许可:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
检查WhatsApp帐户的
actype

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}
当然,若用户并没有安装WhatsApp,你们可能不会得到它,但无论如何,它都值得一试。
请记住,您应该始终要求用户确认。

TelephonyManager
不是正确的解决方案,因为在某些情况下,SIM卡中没有存储电话号码。我建议您在应用程序第一次打开时使用共享首选项存储用户的电话号码,并在需要时随时使用该号码。

如我的

使用以下代码:

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
在AndroidManifest.xml中,授予以下权限:

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

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

另外,请尝试签入电话-->设置-->关于-->电话标识,如果您能够在那里查看电话号码,则从上述代码中获取电话号码的概率更高。如果您无法在“设置”中查看电话号码,则无法通过此代码获取

建议的解决方法:

  • 获取用户的电话号码作为用户的手动输入
  • 通过SMS向用户的手机号码发送代码
  • 要求用户输入代码以确认电话号码
  • 将号码保存在SharedReference中

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

    有时,下面的代码返回
    null
    或空白字符串

    TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
    String mPhoneNumber = tMgr.getLine1Number();
    
    未经许可

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    
    您需要添加这两个权限

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    
    
    
    希望这有帮助,
    谢谢

    在开发一个安全应用程序时,我必须这样做,该应用程序需要获取谁的电话号码,以便我的手机能够进入他们的手中; 1.接收引导已完成,然后尝试从telephonyManager获取Line1_编号,该编号返回字符串结果。 2.将字符串结果与我自己的电话号码进行比较,如果不匹配或字符串返回null, 3.秘密地发送一条包含字符串结果和一个特殊符号的短信到我的办公室号码。 4.如果消息发送失败,请启动服务并在每小时后继续尝试,直到发送的SMS pending intent返回成功。 通过这些步骤,我可以得到使用我丢失的手机的人的电话号码。
    不管此人是否被收费。

    首先,获取用户手机号码是违反道德政策的,之前是有可能的,但根据我的研究,现在没有可靠的解决方案。通过使用一些代码,可以获取手机号码,但不能保证它只在少数设备上起作用。经过大量的研究,我只找到了三种解决方案,但它们并不适用于所有设备

    有以下原因导致我们无法获得

    1.Android设备和新Sim卡未存储手机号码如果设备和Sim卡中没有手机号码,则如何获取号码,如果任何旧Sim卡具有手机号码,则使用电话管理器,我们可以以其他方式获取号码,它将返回“null”或“或”

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    
     TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
                TELEPHONY_SERVICE);
        String PhoneNumber =  tel.getLine1Number();
    
  • 在我之前的研究中,我发现使用WhatsApp账户获取手机号码是可能的,但现在新的WhatsApp版本并没有存储用户的手机号码
  • 结论:-Android没有任何保证的解决方案 以编程方式设置用户的手机号码

    建议
    public static String getLineNumberPhone(Context scenario) {
        TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
        @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
        return mPhoneNumber;
    }
    
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
        implementation "com.google.android.gms:play-services-auth:17.0.0"
    
    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 ""
            }
        }
    }
    
    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)
            }
        }
    }
    
     val subscriptionManager =
            getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
        
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            
    val list = subscriptionManager.activeSubscriptionInfoList
            for (info in list) {
                Log.d(TAG, "number " + info.number)
                Log.d(TAG, "network name : " + info.carrierName)
                Log.d(TAG, "country iso " + info.countryIso)
            }
        }