現在、アプリケーションをAndroid Mの新しい権限モデルに適合させようとしています。
必要なすべての権限を収集してから実行します
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissionsには、Android.permission.WRITE_EXTERNAL_STORAGE
などの必要なアクセス許可が保持されます。
LogcatにLog行があるので、そのルーチンは間違いなく実行されます。
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: Android.permission.RECEIVE_BOOT_COMPLETED; Android.permission.WRITE_EXTERNAL_STORAGE
しかし、許可ダイアログは決して表示されず、もちろんonRequestPermissionsResult()が呼び出されます。
私は何を間違えていますか?いくつかのチュートリアルに基づいて、私は何も見逃していません。テスト用のエミュレーターのみがあり、物理デバイスはありません。これは、設定からの画面です: Image
他に言及する価値があるかもしれません:インストールされたアプリの概要をホーム画面から開こうとすると、launcher3 has exited
しか表示されません。それが関連しているのかどうかはわかりません。
なぜ表示されないのか誰にも分かりますか?
Hilalからのコメントに基づきます(どうもありがとう!):私の場合、私のアプリは実際にtabhostを使用しており、権限はtabhost内のアクティビティから要求されました。許可を要求する別のアクティビティを開始した後、それは機能しています。
同じ問題が発生しましたが、後でマニフェストファイルに権限を追加するのを忘れたことに気付きました。 uses-permissionタグを追加した後、システムはダイアログを表示しました。たぶん誰かを助けます。
問題の原因を突き止めるのに1日かかりました。 元の答え 助けてくれました。
次のようにtools:remove="Android:maxSdkVersion"
を追加して修正しました。
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="Android:maxSdkVersion"/>
REQUEST_CODEとして負の値を使用していたため、同じ問題が発生しました。
requestPermissions(new String[]{Android.Manifest.permission.CAMERA}, -1)
正の値を使用した後、システムはダイアログを表示しました。それが誰かを助けることを願っています。
私は同じ問題を抱えていました。私の問題は、マニフェストの間違った場所に許可を書いたことです。使用許可がアプリケーションの外部にあることを確認します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.google.Android.gms.samples.vision.face.photo"
Android:installLocation="auto"
Android:versionCode="1"
Android:versionName="1" >
<uses-sdk
Android:minSdkVersion="9"
Android:targetSdkVersion="21" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>
<application
Android:hardwareAccelerated="true"
Android:label="FacePhotoDemo"
Android:allowBackup="true"
Android:icon="@drawable/icon">
追加
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
androidManifest.xmlで
注:取得するアクセス許可。例:Android.permission.ACCESS_FINE_LOCATIONなど。
@shanraisshanの答えに追加するために、REQUEST_CODE
は実際には0より大きいだけでなく、負ではない必要があります。
私たちのコードでは、それは単純なスペルミスでした。
我々は持っていた:
<uses-permission Android:name="Android.permission.ACCESS_COURSE_LOCATION" />
そのはず:
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
私は同じ問題を抱えており、このようなshouldShowRequestPermissionRationaleを追加した後、問題は解決しました:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
<uses-permission-sdk23>
要素を使用すると、アクセス許可ダイアログが表示されない、またはアプリケーションがクラッシュするという状況に遭遇しましたが、原因は現在の6.0デバイスのシステムバグのようです。
https://code.google.com/p/Android/issues/detail?id=189841
クラッシュ例外:
Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Android.packageinstaller/com.Android.packageinstaller.permission.ui.GrantPermissionsActivity}: Java.lang.NullPointerException: Attempt to get length of null array
私の場合、私が要求していた許可(WRITE_SETTINGS)はより特別であり、起動するには設定アクティビティが必要でした。そのため、ダイアログは表示されませんでした。
次のコードを使用して許可を得る必要がありました。
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
危険な許可を要求するときに許可ダイアログが表示されない別の原因...
ビルド->プロジェクトのクリーンを実行し、その後ビルド->プロジェクトのリビルドを実行する必要がありました。 Android Studioは、マニフェストで行った変更を認識しなかったと思います。
誰かがWRITE_SETTINGS
を変更/修正するアプリケーションを使用していて、この問題に直面している場合。チェックアウト WRITE_SETTINGSの曖昧さに対するCommonsWareの回答
2週間この問題に直面していましたが、requestPermissions
がWRITE_SETTINGS
許可をリクエストしても機能しないという事実が原因であることに気付きました。これが役立つことを願っています:D
マニフェストのパーミッション定数の大文字と小文字が間違っているため、同様の問題が発生しました。小文字でread_contacts
を使用していました。
<uses-permission Android:name="Android.permission.read_contacts" />
read_contacts
を大文字に変更した後、期待どおりに動作し始めました
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
上記の回答で述べたすべてのことを行いましたが、ダイアログはまだ表示されていなかったので、gradleでtargetSdkVersion
を23
に変更して表示されました。これが誰かを助けることを願っています
マニフェストで、私は変更しました
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
Android:maxSdkVersion="22" />
に
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
/>
たぶんそれが役立ちます。
私の場合、マニフェストファイルで「ACCESS_COARSE_LOCATION」を要求してから、コードで「ACCESS_FINE_LOCATION」許可を要求したため、許可ダイアログが開かれませんでした。
同じ(私は推測する)問題があり、解決策は削除されました
import <app package>.Manifest;
ファイルの先頭にあるAndroid Studioによって自動インポートされ、
import Android.Manifest;
働き始めた
私の場合、解決策は文字列自体です
Android.permission.READ_CONTACTS
無音エラーの原因となるManifest.permission.READ_CONTACTSを実行しました(画面に表示されます)。
これが正しいことを確認してください
targetSdkVersionを22に設定します。
@Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
// We use 16 bits of the request code to encode the fragment id when
// requesting permissions from a fragment. Hence, requestPermissions()
// should validate the code against that but we cannot override it as we
// can not then call super and also the ActivityCompat would call back to
// this override. To handle this we use dependency inversion where we are
// the validator of request codes when requesting permissions in
// ActivityCompat.
if (!mRequestedPermissionsFromFragment
&& requestCode != -1 && (requestCode & 0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
}
マニフェストファイルにもアクセス許可を追加します。
私はrequestPermissions()を次々に2回呼び出していました。このエラーメッセージはLogcatに表示されました(「リクエスト」のスペルミスに注意してください):
Can reqeust only one set of permissions at a time
requestPermissions()は、実際には一度に複数のリクエストを受け取るように設計されています。それがString配列の目的です。
しばらく検索した後、compileSdkVersionの値を「Android-MNC」に設定するか、今日の時点で23に設定する必要があります。これには、Android Studioを必要とするGradleビルドシステムが必要です。少なくとも私はそれをgradleファイルの外に設定する方法に関する単一のマニュアルを見つけることができませんでした。
同じ問題がありました。後で、マニフェストですべてのアクセス許可を宣言する必要があることに気付きました(1つが別のサブクラスであっても)。私の場合、私は宣言しました
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
私のマニフェストで、ユーザーの大まかな場所にアクセスしようとしていました。
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
マニフェストに粗い許可を追加することで問題を修正しました。
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>