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