2

いくつかのシステム権限が必要なアプリを開発していますが、Android Marshmallowのインストール時に自動的に許可されなくなりました。Android Marshmallow:プログラムでランタイムパーミッションを許可する方法はありますか?

実行時にこれらのアクセス許可を要求し、システムアクセス許可ダイアログが表示されたときにユーザーが「許可」ボタンをタップする必要なく、何らかの自動化を実行したいとします。

どうすればこの問題を解決できますか?マシュマロとそれ以降のバージョンでそうする方法はありますか?マシュマロ以降の権限については

答えて

3

は(以前に付与されていない場合。)インストール時に付与されていないと、実行時に必要なときに要求されている必要があり

これを行うには、システムのアクセス権ダイアログをポップアップ表示するActivityCompat.requestPermissions()を実行する必要がありますユーザが追加のシステム権限を必要とするアクションを実行しているときに、アクティビティに追加する必要があります。

WRITE_EXTERNAL_STORAGE許可のために、この例は次のようになります。

ActivityCompat.requestPermissions(
    this, 
    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
    WRITE_EXTERNAL_STORAGE_REQUEST_CODE 
); 

注:WRITE_EXTERNAL_STORAGE_REQUEST_CODEあなたが他の場所で定義する必要があり、任意の整数の定数です。

要求するアクセス許可は、AndroidManifest.xmlでも宣言する必要があります。この例では、宣言は次のようになります。また、あなたの活動にonRequestPermissionsResult()を実装する必要があります、システム権限ダイアログ応答を処理するために

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

。この例のコードは、あなたがEspressoUIAutomatorおよび/または他のいくつかのUIテストフレームワークを通して、あなたのアプリを自動化している場合は、そのことができ、あなたのテスト中にシステムダイアログを予測し、クリックする必要があります

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { 
    if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) { 
     return; //permission not granted, could also optionally log an error 
    } 
    if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) { 
     //Do whatever you needed the write permissions for    
    } 
} 

のようになります次のテストコードを用いて達成され:

private void allowPermissionsIfNeeded() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     UiObject allowPermissions = mDevice.findObject(new UiSelector().text("Allow")); 
     if (allowPermissions.exists()) { 
      try { 
       allowPermissions.click(); 
      } catch (UiObjectNotFoundException e) { 
       Timber.e(e, "There is no permissions dialog to interact with "); 
      } 
     } 
    } 
} 

試験システムUI権限のより包括的な説明はhere利用可能です。

+0

詳細な説明をいただきありがとうございますが、私は「エスプレッソ」の後ろの最後の部分のみが必要です。ところで、私は「Espresso」を通して私のアプリを自動化していません、私はちょうどボタンをクリックし、アプリ内からアプリの流れをコントロールしています。 「エスプレッソ」のようなものを使わずにそうすることは可能ですか? – KayPee

+0

あなたは歓迎です。正確に何を自動化しようとしていますか?これは現在どのようにしていますか?質問の説明から、あなたが達成しようとしていること(またはアプリ内のボタンを「クリック」すること)が少し不明です。 –

+0

これは、button1をクリックしたいときはいつでも、button1.performClick()を実行することを意味します。同様に、私のアプリが許可を求めるときはいつでも、システムダイアログで「許可」をクリックする方法はありますか? – KayPee

0

あなたのアプリが危険な許可を必要とする場合、あなたはその権限にあなたがあなたは、次の手順を実行する必要があることを許可

を必要とする操作を実行するたびに持っているかどうかを確認する必要があります。 1。

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.READ_CONTACTS) 
     != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.READ_CONTACTS)) { 

     // Show an explanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

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

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

は、私が見つけた

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
+0

ありがとう@Surya、私は既に私のアプリに上記のコードを追加して、うまく動作します。つまり、アプリ内から権限を付与したいのです。権限ダイアログが表示されるたびに、自動的に「許可」をクリックするか、そのようなものが表示されます。 – KayPee

1

権限要求応答を処理権限権限について

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.WRITE_CALENDAR); 

リクエストを確認してくださいという点でUIAutomatorやエスプレッソを使用せずに許可受諾を自動化する簡単な方法CIシナリオは、adb経由でapkをプリインストールすることです。

adb install -g {my_apk_file} 

-gフラグは、アプリケーションにすべてのマニフェスト権限を自動的に付与します。その後、エスプレッソ・テスト・スイートを起動すると、uiは再度エスプレッソ・テスト・スイートを与えるように求めません。

+0

これはスーパーユーザモードで役立ちました –

関連する問題