web-dev-qa-db-ja.com

ActivityCompat.requestPermissionsにダイアログボックスが表示されない

if (ContextCompat.checkSelfPermission(RegisterActivity.this,      Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED){
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE_PERMISSION);

私はネクサス5 API 23でこの関数を使用しようとしていますが、ダイアログボックスが表示されないように見えますが、何もしていません。何が問題を引き起こす可能性がありますか? (このコードはJavaアクティビティにあります)最小APIを23に変更して、ActivityCompatなしでrequestPermissions()を使用しようとしましたが、まだ機能していません。

apply plugin: 'com.Android.application'

Android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.example.idanayzen.photomap"
    minSdkVersion 23
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.google.Android.gms:play-services:8.4.0'
compile 'com.Android.support:design:23.1.1'
}

およびマニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.idanayzen.photomap">

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.READ_SMS" />

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">


    <meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="@string/google_maps_key" />

    <activity
        Android:name=".MapsActivity"
        Android:label="@string/title_activity_maps" />
    <activity Android:name=".RegisterActivity">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity Android:name=".WrongPhoneNum"></activity>
</application>

</manifest>
52
Idan Ayzen

requestPermissions()の使用例を次に示します。

まず、マニフェストで(投稿で行ったように)許可を定義します。そうしないと、リクエストが自動的に拒否されます。

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

次に、onRequestPermissionsResult()で許可コールバックを処理する値を定義します。

private final int REQUEST_PERMISSION_PHONE_STATE=1;

RequestPermissions()を呼び出すコードは次のとおりです。

private void showPhoneStatePermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.READ_PHONE_STATE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_PHONE_STATE)) {
            showExplanation("Permission Needed", "Rationale", Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
        } else {
            requestPermission(Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
        }
    } else {
        Toast.makeText(MainActivity.this, "Permission (already) Granted!", Toast.LENGTH_SHORT).show();
    }
}

まず、既にアクセス許可があるかどうかを確認します(アクセス許可が付与された後でも、ユーザーは後でアプリの設定でアクセス許可を取り消すことができます)。

そして最後に、これはあなたが許可を受けたかどうかを確認する方法です:

@Override
public void onRequestPermissionsResult(
        int requestCode,
        String permissions[],
        int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PERMISSION_PHONE_STATE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(MainActivity.this, "Permission Granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
            }
    }
}

private void showExplanation(String title,
                             String message,
                             final String permission,
                             final int permissionRequestCode) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title)
            .setMessage(message)
            .setPositiveButton(Android.R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    requestPermission(permission, permissionRequestCode);
                }
            });
    builder.create().show();
}

private void requestPermission(String permissionName, int permissionRequestCode) {
    ActivityCompat.requestPermissions(this,
            new String[]{permissionName}, permissionRequestCode);
}
76
NightSkyDev

私は同じ問題を抱えていましたが、それは manifest merger tool が依存関係からAndroid:maxSdkVersion属性を引き込んだためであることが判明しました。

APKでリクエストしている実際の権限を表示するには、次のようにaaptツールを使用できます。

/path/to/Android-sdk/build-tools/version/aapt d permissions /path/to/your-apk.apk

私の場合、それは印刷しました:

uses-permission: name='Android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18'

マニフェストでmaxSdkVersionを指定していませんでしたが。マニフェストの<uses-permission>を次のように変更して、この問題を修正しました。

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

(ツールの名前空間はhttp://schemas.Android.com/toolsです)

35
hrunk

これが他の人の助けになることを願っています。

WRITE_EXTERNAL_STORAGEの許可を要求する必要がありましたが、言及されているさまざまな提案をすべて試してもポップアップが表示されませんでした。

最後の犯人はHockeyAppでした。マニフェストマージを使用して、最大SDKバージョンを適用することを除き、WRITE_EXTERNAL_STORAGEに対する独自の権限を含めます。

この問題を回避する方法は、HockeyAppのバージョンと成功をオーバーライドするために、マニフェストファイルにそれを含めますが、それに対する置き換えを行います!

4.7.2外部ストレージ許可を要求するその他の依存関係(SDKバージョン5.0.0以降)Android Oに対応するため、HockeySDK-Android 5.0.0以降では、maxSdkVersionフィルターを使用してWRITE_EXTERNAL_STORAGE許可を制限します。いくつかのユースケースでは、例えばアプリにこの権限を必要とする依存関係が含まれる場合、maxSdkVersionでは、それらの依存関係が権限を許可または要求することを不可能にします。これらの場合の解決策は次のとおりです。

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

優先度の低いマニフェストの他の属性は、マージされる代わりに置き換えられます。

https://support.hockeyapp.net/kb/client-integration-Android/hockeyapp-for-Android-sdk#permissions-advanced

20
Talha

交換:

ActivityCompat.requestPermissions(this, new String[]{"Manifest.permission.READ_PHONE_STATE"}, 225);

で:

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

その許可の実際の文字列"Manifest.permission.READ_PHONE_STATE"ではありません。シンボルManifest.permission.READ_PHONE_STATEを使用します。

8
CommonsWare

ターゲットSDKバージョンを22から23に更新しましたが、完全に機能しました。

4
Shyam Sunder

コードの1行で問題になることはありません。

一部のデバイス(Androidに在庫があるかどうかは思い出せません)の[許可]ダイアログには、[二度と尋ねない]というラベルの付いたチェックボックスが含まれています。チェックボックスがオンの状態で[拒否]をクリックすると、その許可を再度求められることはなく、アプリに対して自動的に拒否されます。これを尊重するには、[設定]-> [アプリ]-> [許可]に移動し、アプリのそのパーマを再度有効にする必要があります。それをオフにして再度拒否します。確認する前に、アプリを再度オフにする必要がある場合があります。

Nexusに搭載されているかどうかはわかりません。たぶん試してみる価値があります。

3
androidguy

私にとって、問題は実際の許可ではなく誤ってグループを要求することでした。

1
Meanman

私は同じ問題を抱えていましたが、Manifest.permission.READ_PHONE_STATEをAndroid.Manifest.permission.READ_PHONE_STATEに置き換えることで解決しました。

1
Beaux

これはちょうど私に起こった。危険な権限のみにフィルタリングする必要があるときに、すべての権限を要求していたことが判明し、突然動作し始めました。

fun requestPermissions() {
    val missingDangerPermissions = PERMISSIONS
            .filter { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }
            .filter { this.getPackageManager().getPermissionInfo(it, PackageManager.GET_META_DATA).protectionLevel == PermissionInfo.PROTECTION_DANGEROUS } // THIS FILTER HERE!

    if (missingDangerPermissions.isNotEmpty()) {
        Log.i(TAG, "Requesting dangerous permission to $missingDangerPermissions.")
        ActivityCompat.requestPermissions(this,
                missingDangerPermissions.toTypedArray(),
                REQUEST_CODE_REQUIRED_PERMISSIONS);
        return
    } else {
        Log.i(TAG, "We had all the permissions we needed (yay!)")
    }
}
1
Benjamin H

私はサムスンS8とN8でこの問題に遭遇しました(他の場所で見つかったハベント)

したがって、問題はマニフェストファイルuses-permissionにあります

<uses-permission Android:name="Android.permission.CAMERA"
Android:requiredFeature="true" />

何らかの理由で、属性Android:requiredFeatureが原因です。理由の説明が見つかりませんでした。

解決するには、単にそれを削除し、

<uses-permission Android:name="Android.permission.CAMERA" />
1
grandia

上記の情報は適切ですが、targetSdkVersionを23(またはそれ以上)に設定すると、マニフェスト内の<uses-permission>タグを「コードで尋ねる」ではなく、Androidに対してcriticalと解釈されます「インストール時に要求します。」多くのソースから<uses-permission>タグが必要であることがわかりますが、その理由は誰にもわかりません。その値が設定されていないと、何時間も混乱してしまいます。

0
Eliot Gillum

私はそれをAPI 23で実行していたので、以下のコードのように許可を要求するためにコードを使用しなければなりませんでした。 MY_PERMISSIONS_REQUEST_READ_LOCATIONは1に等しい整数であることに注意してくださいint MY_PERMISSIONS_REQUEST_READ_LOCATION = 1

if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.M){requestPermissions(new String [] {Manifest.permission.ACCESS_COARSE_LOCATION}、MY_PERMISSIONS_REQUEST_READ_LOCATION); }

0
Jair Martinez

たぶん、このソリューションは次のような人よりも役立つでしょう:

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

つかいます :

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

Android.Manifest.permission.WRITE_EXTERNAL_STORAGEに追加します

0
user10955646

私にとって問題は、無効なリクエストコードがあったことです。要求コードとして0xDEADBEEFを選択しましたが、静かに失敗しました(内部で32ビットより小さいものにキャストされている可能性があります)。

0
griffin2000

私にとって問題は、リクエストを行った直後に、私のメインアクティビティが別のアクティビティを開始したことでした。それはダイアログに取って代わり、見られませんでした。

0
JohnT

私にとって、エラーはマニフェストにありました。許可は大文字でした。 Android St​​udioは、アクセス許可を大文字で提案します。私はそれを気にせず、この問題を解決するのに2時間かかりました。

許可の正しい構文は
<uses-permission Android:name = "Android.permission.WRITE_EXTERNAL_STORAGE" />

0
AlainPre

私はこれと同じ問題を抱えていました。buildToolsVersion "23.0.3"に更新されました。これがこの問題を抱えている人に役立つことを願っています。

0
Bk245