web-dev-qa-db-ja.com

Android M許可ダイアログが表示されない

現在、アプリケーションを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しか表示されません。それが関連しているのかどうかはわかりません。

なぜ表示されないのか誰にも分かりますか?

66
Jens

Hilalからのコメントに基づきます(どうもありがとう!):私の場合、私のアプリは実際にtabhostを使用しており、権限はtabhost内のアクティビティから要求されました。許可を要求する別のアクティビティを開始した後、それは機能しています。

10
Jens

同じ問題が発生しましたが、後でマニフェストファイルに権限を追加するのを忘れたことに気付きました。 uses-permissionタグを追加した後、システムはダイアログを表示しました。たぶん誰かを助けます。

104
Tamás Cseh

問題の原因を突き止めるのに1日かかりました。 元の答え 助けてくれました。

次のようにtools:remove="Android:maxSdkVersion"を追加して修正しました。

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="Android:maxSdkVersion"/>
24
Khang .NT

REQUEST_CODEとして負の値を使用していたため、同じ問題が発生しました。

requestPermissions(new String[]{Android.Manifest.permission.CAMERA}, -1)

正の値を使用した後、システムはダイアログを表示しました。それが誰かを助けることを願っています。

13
shanraisshan

私は同じ問題を抱えていました。私の問題は、マニフェストの間違った場所に許可を書いたことです。使用許可がアプリケーションの外部にあることを確認します。

    <?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">
9
サソリ

追加

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

androidManifest.xmlで

注:取得するアクセス許可。例:Android.permission.ACCESS_FINE_LOCATIONなど。

9
Vinil Chandran

@shanraisshanの答えに追加するために、REQUEST_CODEは実際には0より大きいだけでなく、負ではない必要があります。

2
joakim

私たちのコードでは、それは単純なスペルミスでした。

我々は持っていた:

<uses-permission Android:name="Android.permission.ACCESS_COURSE_LOCATION" /> 

そのはず:

<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
2
user3663026

私は同じ問題を抱えており、このようなshouldShowRequestPermissionRationaleを追加した後、問題は解決しました:

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

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

}
2

<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
2
TheIT

私の場合、私が要求していた許可(WRITE_SETTINGS)はより特別であり、起動するには設定アクティビティが必要でした。そのため、ダイアログは表示されませんでした。

次のコードを使用して許可を得る必要がありました。

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
1
M. Usman Khan

危険な許可を要求するときに許可ダイアログが表示されない別の原因...

ビルド->プロジェクトのクリーンを実行し、その後ビルド->プロジェクトのリビルドを実行する必要がありました。 Android St​​udioは、マニフェストで行った変更を認識しなかったと思います。

1
Magnus W

誰かがWRITE_SETTINGSを変更/修正するアプリケーションを使用していて、この問題に直面している場合。チェックアウト WRITE_SETTINGSの曖昧さに対するCommonsWareの回答

2週間この問題に直面していましたが、requestPermissionsWRITE_SETTINGS許可をリクエストしても機能しないという事実が原因であることに気付きました。これが役立つことを願っています:D

1
Irfan S

マニフェストのパーミッション定数の大文字と小文字が間違っているため、同様の問題が発生しました。小文字でread_contactsを使用していました。

<uses-permission Android:name="Android.permission.read_contacts" />

read_contactsを大文字に変更した後、期待どおりに動作し始めました

<uses-permission Android:name="Android.permission.READ_CONTACTS" />
1
Roberto

権限はカテゴリに分類されるため、重要な権限はダイアログが表示されることなく付与されます。

インターネットの許可ではこれが難しい方法であることがわかりました。この問題が発生している場合、read_contactsなどの重要な許可に変更すると、フローをテストして、問題が重要ではない許可または他の許可であるかどうかを明らかにできます.

通常の保護 権限がリストされています ここ

1
Nick Cardoso

上記の回答で述べたすべてのことを行いましたが、ダイアログはまだ表示されていなかったので、gradleでtargetSdkVersion23に変更して表示されました。これが誰かを助けることを願っています

1
Naveen Rao

マニフェストで、私は変更しました

 <uses-permission
    Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
    Android:maxSdkVersion="22" />

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

たぶんそれが役立ちます。

1
mogile_oli

私の場合、マニフェストファイルで「ACCESS_COARSE_LOCATION」を要求してから、コードで「ACCESS_FINE_LOCATION」許可を要求したため、許可ダイアログが開かれませんでした。

0
Akash Bisariya

同じ(私は推測する)問題があり、解決策は削除されました

import <app package>.Manifest;

ファイルの先頭にあるAndroid St​​udioによって自動インポートされ、

import Android.Manifest; 

働き始めた

0

私の場合、解決策は文字列自体です

Android.permission.READ_CONTACTS

無音エラーの原因となるManifest.permission.READ_CONTACTSを実行しました(画面に表示されます)。

これが正しいことを確認してください

0
Kadir Erturk

targetSdkVersion22に設定します。

0
Iman Marashi
@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");
        }
    }
0
Ahmad Aghazadeh

マニフェストファイルにもアクセス許可を追加します。

0
Phani varma

私はrequestPermissions()を次々に2回呼び出していました。このエラーメッセージはLogcatに表示されました(「リクエスト」のスペルミスに注意してください):

Can reqeust only one set of permissions at a time

requestPermissions()は、実際には一度に複数のリクエストを受け取るように設計されています。それがString配列の目的です。

0
paperduck

しばらく検索した後、compileSdkVersionの値を「Android-MNC」に設定するか、今日の時点で23に設定する必要があります。これには、Android St​​udioを必要とするGradleビルドシステムが必要です。少なくとも私はそれをgradleファイルの外に設定する方法に関する単一のマニュアルを見つけることができませんでした。

0
Jens

同じ問題がありました。後で、マニフェストですべてのアクセス許可を宣言する必要があることに気付きました(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"/>
0
shahrukhamd