2017-02-08 4 views
1

Google의 목표는 AndroidTest (AndroidJUnit4)를 사용하여 자동 테스트를 실행하는 것입니다.PACKAGE_USAGE_STATS 권한이있는 AndroidTest

우리는 SDK> = 23

public static void grantPermission(String permission) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (!hasPermission(permission)) 
      getInstrumentation().getUiAutomation() 
           .executeShellCommand("pm grant " + getTargetContext().getPackageName() + " " + permission); 
    } 
} 

@Before 
public void setUp() throws Exception { 
    grantPermission("android.permission.ACCESS_NETWORK_STATE"); 
    grantPermission("android.permission.CHANGE_NETWORK_STATE"); 
    grantPermission("android.permission.CAMERA "); 
    grantPermission("android.permission.INTERNET"); 
    grantPermission("android.permission.READ_EXTERNAL_STORAGE "); 
    grantPermission("android.permission.WRITE_EXTERNAL_STORAGE");   
    grantPermission("android.permission.PACKAGE_USAGE_STATS");  
} 

방법은

android.permission.READ_EXTERNAL_STORAGE 
android.permission.WRITE_EXTERNAL_STORAGE 
android.permission.CAMERA 

비록 설정에서/사용 액세스 보안/애플 리케이션, 우리의 응용 프로그램에 대해 잘 때 권한을 부여하기 위해이 코드를 사용했다 이 코드를 사용하여 권한을 확인하는 경우에도 여전히 해당 권한이 없습니다.

AppOpsManager appOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); 

// return MODE_DEFAULT, not MODE_ALLOWED 
int result = appOps.checkOpNoThrow("android:get_usage_stats", android.os.Process.myUid(), context.getPackageName()) 

이 목표를 달성하려면 어떻게해야합니까?

답변

1

. 마지막으로, 우리는 성공했다.

승인 된 탭을 시뮬레이트하기 위해 "adb 쉘 입력 탭 [x], [y]"가 사용되었으므로 사람이 스위치를 트리거하는 스크린과 비슷합니다.

이것은 우리가 사용하는 코드입니다.

private void grantPermission() throws InterruptedException { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     Context context = InstrumentationRegistry.getTargetContext(); 
     final AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 

     // check if the app doesn't have permission 
     if (appOps.checkOpNoThrow("android:get_usage_stats", android.os.Process.myUid(), context.getPackageName()) != AppOpsManager.MODE_ALLOWED) { 
      UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation(); 

      //Open UsageAccessSettingsActivity 
      automation.executeShellCommand("am start com.android.settings/.Settings$UsageAccessSettingsActivity"); 
      Thread.sleep(1000); 

      //Open the setting of the first app 
      automation.executeShellCommand(String.format("input tap %s %s", dpToPx(100), dpToPx(138))); 
      Thread.sleep(1000); 

      //Tap permit usage access 
      automation.executeShellCommand(String.format("input tap %s %s", dpToPx(100), dpToPx(164))); 
      Thread.sleep(1000); 
     } 
    } 
} 

public static int dpToPx(int dp) { 
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density); 
} 

우리는 hdip, xhdip 및 xxhdip와 SDK (23, 24)에 6 AVD에 시도했다. 모든 작품.

는 업데이트] [2/10] :

우리는 그것을 할 수있는 또 다른 쉬운 방법을 발견했다. "adb shell appops"를 사용하십시오. 이것은 우리 코드입니다.

@Before 
public void setUp() throws Exception { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     Context context = InstrumentationRegistry.getTargetContext(); 
     final AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 

     if (appOps.checkOpNoThrow("android:get_usage_stats", android.os.Process.myUid(), context.getPackageName()) != AppOpsManager.MODE_ALLOWED) { 
      InstrumentationRegistry 
        .getInstrumentation() 
        .getUiAutomation() 
        .executeShellCommand("appops set " + context.getPackageName() + " android:get_usage_stats allow"); 
     } 
    } 
} 
0

앱의 사용 통계가 사용 설정되어 있는지 확인하십시오. 사용 통계 활동을 시작하여이를 확인할 수 있습니다. 버튼 클릭에 onCreate 방법에 코드에 이것을 추가하거나 수 : 우리는 승인 많은 시도

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
startActivity(intent); 
+0

우리는 활동을 시작했지만 사용자는 사용 권한을 허용 할 수 있지만 자동화 된 테스트를 실행하는 것이 목표이므로 사용자가 프로그래밍 방식으로 사용자가 이미 권한을 부여했음을 시뮬레이션하려고합니다. – Wade

관련 문제