如何将权限READ_PHONE_状态添加到Android instrumentation测试?

如何将权限READ_PHONE_状态添加到Android instrumentation测试?,android,Android,我是Android Studio上的新手。通过使用UiAutomator编写插装测试,我完成了一些自动测试。然而,当我需要获取设备IMEI和服务状态(需要权限读取电话状态)时,我总是得到不允许执行的SecurityException,即使我在清单和代码中添加了权限 检查Android文档我知道权限读取\手机\状态处于危险级别,所以我需要在运行时获得用户的权限。但问题是我的测试代码不包含活动。我在web上做了几天的研究,包括在堆栈溢出中找出一个可能的解决方案,但运气不好 我尝试的内容包括: 1.使

我是Android Studio上的新手。通过使用UiAutomator编写插装测试,我完成了一些自动测试。然而,当我需要获取设备IMEI和服务状态(需要权限读取电话状态)时,我总是得到不允许执行的SecurityException,即使我在清单和代码中添加了权限

检查Android文档我知道权限读取\手机\状态处于危险级别,所以我需要在运行时获得用户的权限。但问题是我的测试代码不包含活动。我在web上做了几天的研究,包括在堆栈溢出中找出一个可能的解决方案,但运气不好

我尝试的内容包括:

1.使用@Rule

@Rule 
public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(android.Manifest.permission.READ_PHONE_STATE);
2.使用shell命令:

myDevice.executeShellCommand("pm grant com.mp.rss android.permission.READ_PHONE_STATE");
3.使用PermissionRequester(我可以在Logcat中看到授予的权限,但仍然得到SecurityException)

在logcat:I/GrantPermissionCallable:Permission:android.Permission.READ\u PHONE\u状态已授予

4.尝试提示请求许可,但失败,因为我的测试程序中没有活动

 int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 100;
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M && context.checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_PHONE_STATE )){
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
    } 
   }
这是我的舱单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mp.rss">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RREAD_PRIVILEGED_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_NUMBER"/>


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" />
</manifest>
以下是我尝试过的上述4种方法的例外信息

`java.lang.SecurityException: com.mp.rss.test from uid 10181 not allowed to perform OP_READ_PHONE_STATE
at android.os.Parcel.createException(Parcel.java:1946)
at android.os.Parcel.readException(Parcel.java:1914)
at android.os.Parcel.readException(Parcel.java:1864)
at com.android.internal.telephony.ITelephony$Stub$Proxy.getServiceStateForSubscriber(ITelephony.java:5590)
at android.telephony.TelephonyManager.getServiceStateForSubscriber(TelephonyManager.java:7576)
at android.telephony.TelephonyManager.getServiceState(TelephonyManager.java:7564)
at .....`
 public class rss {
      private static UiDevice myDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
      private static Context context = InstrumentationRegistry.getInstrumentation().getContext();
      public static void writeDeviceinfo( ) throws IOException, NullPointerException, UiObjectNotFoundException {
        PermissionRequester pr = new PermissionRequester();
        pr.addPermissions("android.permission.READ_PHONE_STATE");
        pr.requestPermissions();
        try {
            TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            writeLog("[PrintInfo] Device service is  = " + tMgr.getServiceState());
        }catch (NullPointerException e) {
            writeLog("[PrintInfo] Device service is = ");
        }
    }
}
`java.lang.SecurityException: com.mp.rss.test from uid 10181 not allowed to perform OP_READ_PHONE_STATE
at android.os.Parcel.createException(Parcel.java:1946)
at android.os.Parcel.readException(Parcel.java:1914)
at android.os.Parcel.readException(Parcel.java:1864)
at com.android.internal.telephony.ITelephony$Stub$Proxy.getServiceStateForSubscriber(ITelephony.java:5590)
at android.telephony.TelephonyManager.getServiceStateForSubscriber(TelephonyManager.java:7576)
at android.telephony.TelephonyManager.getServiceState(TelephonyManager.java:7564)
at .....`