在API 23中,requestPermissions()无法处理Manifest.permission.MODIFY_PHONE_STATE权限。

3

我在实现运行时权限时遇到了问题。我查看了以下链接以实现运行时权限:

https://developer.android.com/training/permissions/requesting.html

我只是遇到android.permission.MODIFY_PHONE_STATE权限的问题。我已经测试了以下代码来获取相机权限,代码可以正常运行。

我遇到的问题如下:

  1. shouldShowRequestPermissionRationale()返回false
  2. requestPermissions()未授予权限。

等级细节:compileSdkVersion 23,buildToolsVersion "23.0.3",targetSdkVersion 23

清单详情:我已添加以下权限

uses-permission android:name="android.permission.MODIFY_PHONE_STATE"

    private static final int PERMISSIONS_REQUEST_CODE = 123;  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int granted = PackageManager.PERMISSION_GRANTED;
        int result = ContextCompat.checkSelfPermission(ActivityMain.this,Manifest.permission.MODIFY_PHONE_STATE);

    if (result == granted) {
        Toast.makeText(ActivityMain.this,"permissions granted",Toast.LENGTH_LONG).show();

    }
    if (result != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(ActivityMain.this, "permissions denied", Toast.LENGTH_LONG).show();
      boolean res = ActivityCompat.shouldShowRequestPermissionRationale(ActivityMain.this,Manifest.permission.MODIFY_PHONE_STATE);
 // returning false
         if (res) {
           new AlertDialog.Builder(ActivityMain.this)
           .setMessage("Allow")
                  .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                     @Override
                      public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(ActivityMain.this,
                                new String[]{Manifest.permission.MODIFY_PHONE_STATE},
                              PERMISSIONS_REQUEST_CODE);
                    }
                 }).setNegativeButton(android.R.string.cancel, null).show();
        } else {
            ActivityCompat.requestPermissions(ActivityMain.this,
                    new String[]{Manifest.permission.MODIFY_PHONE_STATE},
                    PERMISSIONS_REQUEST_CODE);
        }
    }
}
    @Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
       switch (requestCode) {
           case PERMISSIONS_REQUEST_CODE: {
             if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(ActivityMain.this,"permissions granted",Toast.LENGTH_LONG).show();
              } else {
                Toast.makeText(ActivityMain.this,"permissions not granted",Toast.LENGTH_LONG).show();
            }
            return;
        }
    }
}
1个回答

4

MODIFY_PHONE_STATE是系统专用权限,因此您无法在应用程序中访问或使用此权限。

Android应用程序分为两种类型:系统和用户。

系统应用基本上是预装在ROM中的应用程序。在标准Android用户环境中,用户没有对/system分区的写访问权限,因此直接安装或卸载系统应用程序是不可能的。

用户应用就是通过Google Play商店进行的所有普通应用程序安装。这些应用程序进入Android手机的数据分区,即为用户数据和应用程序提供的内部存储器的一部分。

要将应用程序安装为系统应用程序,请确保您的Android设备已经root或已安装自定义恢复(或两者都有)。


但是在API 23以下,我们可以通过在清单文件中简单地声明来使用此权限,那么为什么Android不允许我们在API 23中使用呢? - Sachin Rana
在AndroidManifest中,如果您声明了此权限,则可以在其中显示错误消息。它将描述您无法访问此权限以及更多详细信息。请查看此链接(https://developer.android.com/reference/android/Manifest.permission.html#MODIFY_PHONE_STATE),注意:**不适用于第三方应用程序**。 - Sujewan
1
你有没有任何想法如何在API 23中处理Android Telephony Manager? - Sachin Rana
请解释一下你实际上为什么需要这个函数。 - Sujewan
1
我想实现自动接听电话功能,但在 marshmallow 上,出现了安全异常问题。为了解决这个问题,我尝试获取运行时权限,但是 Android 不授予修改电话状态的权限。 - Sachin Rana
@Sujewan 你的意思是使用ITelephony.aidl无法以编程方式结束通话?那么电话拦截应用程序是如何实现的呢?请也看看我的问题。https://stackoverflow.com/q/50819906/6444297 - Alireza Noorali

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