Android M 权限测试中的 READ_PHONE_STATE(危险权限)

12
如果设备运行 Android 6.0 或更高版本,并且我正在使用 getLine1Number() 获取电话号码,则会出现以下错误信息:java.lang.SecurityException: 需要 READ_PHONE_STATE 权限:用户 10184 和当前进程都没有 android.permission.READ_PHONE_STATE。 我已经声明了以下权限:

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

https://dev59.com/fFwY5IYBdhLWcg3waXS5 - CommonsWare
抱歉先生,我再问一遍,谢谢您的回答。 - Sanket Prabhu
2个回答

21

在Android 6.0中,你需要明确要求用户授权权限。仅在清单中声明是不够的。

这篇文章是学习新模型的好起点,但我会给出简要概述。

每次执行需要“危险权限”的操作时,都需要检查当前是否已授予该权限,因为用户可以随时撤销它。

可以使用checkSelfPermission方法来完成此操作。

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_PHONE_STATE)
    != PackageManager.PERMISSION_GRANTED) {
        // We do not have this permission. Let's ask the user
}

您可以使用requestPermissions方法请求权限,如下所示

ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_READ_STATE);

在回调方法中,您需要使用您定义的常量整数PERMISSION_READ_STATE进行检查。

然后您将覆盖您的活动中的onRequestPermissionsResult方法,并查看是否已授予该权限。 如果是,那么您可以继续执行危险操作。

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_READ_STATE: {
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission granted!
                // you may now do the action that requires this permission
            } else {
                // permission denied
            }
            return;
        }

    }
}

先生,不打扰用户的情况下是否可能? - Sanket Prabhu
1
不,从6.0版本开始我们必须直接询问用户。如果您想更好地了解为什么Android正在朝这个方向发展,您可以观看来自Google的这个视频:https://www.youtube.com/watch?v=f17qe9vZ8RM - Andrew Brooke
需要明确询问的权限清单吗? - JiTHiN
任何被认为是“危险”的权限。请参见此处:https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous - Andrew Brooke

4
public class MainActivity extends AppCompatActivity {

    TextView textView;
    String device_unique_id,IMEI;


    private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 0;


   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView)findViewById(R.id.textView);
    }
    public void GetImei(View view)
    {



        loadIMEI();

    }

    public void loadIMEI() {
        // Check if the READ_PHONE_STATE permission is already available.
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_PHONE_STATE)) {
//                get_imei_data();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
                        MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
            }
        } else {

            TelephonyManager mngr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
            IMEI = mngr.getDeviceId();
            device_unique_id = Settings.Secure.getString(this.getContentResolver(),
                    Settings.Secure.ANDROID_ID);
            textView.setText(device_unique_id+"----"+mngr.getDeviceId());
            // READ_PHONE_STATE permission is already been granted.
            Toast.makeText(this,"Alredy granted",Toast.LENGTH_SHORT).show();
        }
    }
       @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {

        if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE) {

            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

//                Toast.makeText(this,"Alredy DONE",Toast.LENGTH_SHORT).show();
                TelephonyManager mngr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
                IMEI = mngr.getDeviceId();
                device_unique_id = Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID);
                textView.setText(device_unique_id+"----"+mngr.getDeviceId());

            } else {
                Toast.makeText(this,"ehgehfg",Toast.LENGTH_SHORT).show();
            }
        }
    }

非常好,Rajasimman!非常出色,而且它按照预期工作!谢谢!!.) - IndexOutOfDevelopersException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接