:システム権限は、2つのカテゴリに分類され、通常の権利と危険な権限:
- 通常の権限は、ユーザーのプライバシーへの即時のリスクをもたらすことはありません。アプリケーションが自分のインベントリに通常の権利を一覧表示した場合、システムが自動的に許可を与えます。
- 危険な権限は、ユーザーの機密データにアクセスするためのアクセスアプリケーションが付与されます。アプリケーションが自分のインベントリに通常の権利を一覧表示した場合、システムが自動的に許可を与えます。あなたは危険な権限を一覧表示する場合は、ユーザーが明示的にこれらの権利を使用するようにアプリケーションを承認する必要があります。
詳細については、を参照してください。危険な通常の権利と特権。
Androidのすべてのバージョンでは、あなたのアプリケーションは、次のような、そのアプリケーションリストに危険な必要があり、通常の権利と特権、宣言する必要があります能力の宣言真ん中を。しかし、のステートメント影響によるシステムおよびアプリケーションのバージョンの異なるターゲットSDKレベルには変化します。
- デバイスは、Android 5.1またはそれ以前のバージョン、実行している場合や、ターゲットSDKアプリケーションを22以下である:あなたがリスト危険な権限にリストされている場合は、ユーザーがアプリケーションをインストールし、この権限を付与する必要があります。彼らはこれを許可しない場合当局は、システムは、アプリケーションをインストールしません。
- デバイスは、Android 6.0以上を実行して、している場合や SDKアプリケーションをターゲット23以上である:アプリケーションの権限は、リストに記載されている必要があり、そしてそれは、それぞれが、実行時に自分のニーズにハザード許可を要求しなければなりません。各ユーザーは、許可または拒否の権限を、ユーザーがアクセス許可の要求を拒否した場合でも、アプリケーションは、限られた機能を実行し続けることができます。
注:アンドロイド6.0(APIレベル23)から出発して、あなたも、低レベルのアプリケーション指向のAPIを呼び出すことができ、任意のアプリケーションの権限からいつでも呼び出すことができます。APIレベルのためのアプリケーションかどうか、あなたは必要な権限が正常であるが存在しない場合にその動作を検証するために、アプリケーションのテストに対処する必要があります。
このレッスンでは、Androidの使用方法について説明サポートライブラリをチェックして、許可を要求します。(APIレベル23)のAndroid 6.0からAndroidのフレームワークは、同様の方法を提供し始めました。しかし、メソッドを呼び出す前に、あなたは、Androidのバージョンのアプリケーションを実行するためにそれをチェックする必要がないため、容易にサポートライブラリを使用。
チェックパーミッション
アプリケーションが危険権限が必要な場合は、この操作を実行するたびに、あなたが権限を持っているかどうかを確認しなければならない権限が必要です。ユーザーは、常にこの権利を自由に呼び出すことで、アプリケーションは昨日のカメラを使用している場合でも、したがって、それはあなたがまだ今日特権を持っていることを想定していません。
あなたが権限を持っているかどうかを確認するには、電話にてお問い合わせくださいContextCompat.checkSelfPermission()
方法を。たとえば、次のコードスニペットは、活動のカレンダーに書き込み権限を持っているを確認する方法を示しています。
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
アプリケーションは、この許可を持っている場合、メソッドは戻りますPackageManager.PERMISSION_GRANTEDを、そしてアプリケーションが動作し続けることができます。アプリケーションがこの権限を持っていない場合、メソッドは戻りますPERMISSION_DENIEDを、そしてアプリケーションがその権限をユーザーに明確でなければなりません。
要求許可
アプリケーションがマニフェスト危険に記載されているアクセス許可のアプリケーションを必要とする場合、それは権限を付与するユーザーを依頼する必要があります。アンドロイドはあなたの方法の許可要求の多様性を提供します。これらのメソッドを呼び出すと、標準のAndroid]ダイアログボックスが表示されますが、あなたはそれをカスタマイズすることはできません。
なぜアプリが権限を必要とする理由
1.図ユーザーが対話システムの権限を許可または拒否するように要求されます。
いくつかのケースでは、あなたがあなたのアプリケーションは、許可を必要とする理由を理解する助けが必要な場合があります。例えば、ユーザは、写真撮影のアプリケーションを起動する場合は、アプリケーションの要件の権限にカメラを使用して、ユーザーは驚かないかもしれませんが、このアプリケーションは、ユーザーの場所や連絡先にアクセスすることを望んでいる理由をユーザーが理解できないことがあります。権限を要求する前に説明をユーザーに提供することを望むかもしれません。覚えておいてください、あなたは説明して、ユーザーを説得する必要はありませんが、あなたはあまりにも多くの説明を提供する場合、ユーザーはがっかりして削除するアプリケーションを見つけることができます。
あなたが取ることができる一つの方法は、ユーザが解説許可要求を提供することを拒否した場合のみです。あなたが機能を使用しようとし続けるための許可が必要ですが、許可要求を拒否し続けた場合、それは、このアプリケーションは、関連する機能を提供するための許可を必要とする理由をユーザーが理解していないことを示してもよいです。この場合は、より良いアプローチは説明を表示することです。
ユーザは説明する必要があるかもしれないここで見つけやすくするために、Androidは[shouldShowRequestPermissionRationale()](すなわち、ユーティリティメソッドを提供https://developer.android.google.cn/reference/android/support/v4/app/ActivityCompat.html #shouldShowRequestPermissionRationale(android.app.Activity、java.lang.Stringで))。アプリケーションは、ユーザー権限の前にこの要求を持っていたが、要求を拒否した場合、このメソッドはを返しますtrue
。
注意:過去にユーザーがアクセス許可の要求を拒否した場合、システムのダイアログボックスを要求し、権限を選択すると、再び聞かないでください、このメソッドが返すのオプションを
false
。デバイスの仕様は、アプリケーションが権限を持っている禁止した場合は、この方法も返しますfalse
。
あなたは許可を要求する必要があります
何のアプリケーションが許可を必要としない場合は、アプリケーションが呼び出す必要がありますrequestPermissions()
適切な権限を要求するための方法を。アプリケーションは、整数を指定して、この要求許可識別するため、その必要な権限を渡し要求コードを。この非同期動作方法は:それはすぐに戻り、ボックスは、ユーザー応答の後に、システムは、アプリケーションのコールバック・メソッドを呼び出した結果を使用する、アプリケーション配信要求コードが同じに伝達されますrequestPermissions()
。
次のコードは、アプリケーションがユーザーの連絡先の読み取り権限が含まれており、必要な権限を要求するかどうかを確認できます。
// 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 expanation 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.
}
}
注:アプリケーションが呼び出すと
requestPermissions()
、システムはユーザーに、標準のダイアログを提示します。アプリケーションはできません ]ダイアログボックスを設定または変更します。ユーザーのための情報や説明を提供する必要がある場合は、呼び出す必要がありますrequestPermissions()
など、前のアプリケーションは許可を必要とする理由を説明真ん中を。
要求応答処理権限
アプリケーションが許可を要求すると、システムはユーザーにダイアログボックスを表示します。ときにユーザの応答、システムは、アプリケーションを呼び出しますonRequestPermissionsResult()
、それをユーザーの応答を渡し、方法を。アプリケーションは、適切なアクセス権が得られているかどうかを調べるために、このメソッドを置き換える必要があります。あなたのコールバック要求のために同じコードを渡すために渡されますrequestPermissions()
。たとえば、アプリケーションの要求場合READ_CONTACTSアクセスは、以下のコールバックメソッドを取ることがあります。
@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
}
}
システムは、アプリケーションで説明したダイアログボックスがアクセスする必要がある表示の権限グループを、それが特定の権限は表示されません。あなたが要求した場合たとえば、READ_CONTACTS権利を、システムは、あなたのアプリケーションのためのダイアログボックスが接触装置にアクセスする必要が表示されます。ユーザーは、各権限グループに一度許可を付与する必要があります。アプリケーションが(アプリケーションのリストに記載されている)、グループ内の他の権限を要求した場合、アプリケーションは自動的にこれらの権限を付与されます。この権限を要求すると、システムはあなたの呼び出しますonRequestPermissionsResult()
渡して、コールバックメソッドをPERMISSION_GRANTED
、ユーザが明示システムダイアログボックスで合意している場合は、あなたの許可を要求し、システムが同じように動作します。
注意:お使いのアプリケーションがまだ明示的にユーザーが他のグループに付与された権限を使用する権限を持っている場合でも、そのニーズごとに許可を要求する必要があります。また、人権団体は、Androidの将来のバージョンで変更されることがあります。あなたのコードは、特定の権限に依存してはならないか、その前提として、同じグループに属していないかもしれません。
たとえば、あなたがアプリケーションリストに列挙されたとしREAD_CONTACTSとWRITE_CONTACTS。あなたが要求した場合READ_CONTACTSを、ユーザーがこの権限を付与され、あなたが要求したとき、そして、WRITE_CONTACTSを、システムは、ユーザと相互作用しない、すぐにあなたに権限を付与します。
ユーザーが許可要求を拒否された場合、アプリケーションは適切な行動を取る必要があります。たとえば、アプリケーションは、ダイアログボックスを表示し、それが実行できない理由を説明するが、ユーザが実行する権限を要求していることが必要です。
システムは許可をユーザーに要求すると、システムを選択することができ、ユーザは、要求されたアクセス権を示すものではありません。この場合は、関係なく、使用中のアプリケーションのrequestPermissions()
再許可を必要と、システムはすぐにこの要求を拒否します。このシステムはあなたの呼び出しますonRequestPermissionsResult()
渡して、コールバックメソッドをPERMISSION_DENIEDは、ユーザーが明示的にあなたの要求を拒否した場合、再び、システムは同じように動作します。これは、あなたが呼び出すときことを意味しrequestPermissions()
、ユーザーとの直接的な相互作用が発生したと想定することはできません。
ます。https://www.jianshu.com/p/8667daa80b05で再現