Android Marshmallowの特定のアプリのアクセス許可画面をプログラムで開く方法は?


330

新しいAndroid Marshmallowリリースについて質問があります。

特定のアプリのパーミッション画面をインテントなどで表示することは可能ですか?

Android M許可画面

次のコードでアプリの設定を表示することは可能です-許可画面を直接開くためのアナログソリューションはありますか?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)));

私はすでにこれについていくつかの調査を行いましたが、適切な解決策を見つけることができませんでした-すべての助けに感謝します!


これを試してみてください。それは作業である可能性があります。stackoverflow.com
a/41221852/5488468

回答:


443

マシュマロの公式の許可ビデオ(4分43秒のマーク)によると、代わりにアプリケーションの設定ページを開く必要があります(そこから1回のクリックで[許可]ページに移動します)。

設定ページを開くには、次のようにします

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

12
アプリケーション画面の一般的な詳細にリダイレクトしています。具体的にはアプリの権限画面に移動する方法。残りのワンクリックも欲しくありません
Milind Mevada 2017

5
@MilindMevada-現時点ではできません。
Martin Konecny 2017

「リアルタイム」で、インテントを使用して設定アクティビティからアクティビティにデータを送信できますか?直面している問題は、設定から送信された、アクティビティでこのデータを処理することです。
ThunderWiring 2017

これはアプリのデバッグ時に機能しますが、APKに署名した後、本当の理由もなくクラッシュします。logcatにも明らかなものはありません。
JCutting8

181

これは不可能です。私もそうしようとしました。パッケージ名とこれから始まるアクティビティが分かりました。ただし、宣言できない権限がないため、最終的にはセキュリティ例外が発生します。

更新:

他の回答に関しては、アプリ設定画面を開くことをお勧めします。私はこれを次のコードで行います:

    public static void startInstalledAppDetailsActivity(final Activity context) {
    if (context == null) {
        return;
    }
    final Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + context.getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    context.startActivity(i);
}

これを履歴スタックに入れたくないので、インテントフラグを使用して削除します。


私は同じことを経験し、回避策/このための別の解決策があるかもしれないと思った...:-/
Frederik Schweiger '30

いいえ、残念ながら、それは設計では不可能です。詳細については、Google +の次のディスカッションをご覧ください:goo.gl/Wqjjff
Frederik Schweiger

1
@Mulgard WhatsappはtargetSdk = "23"を使用する必要があります。これにより、アプリはユーザーに権限を有効にするように求めることができます。ターゲットSDKが23未満の場合、ユーザーにアプリの権限画面を表示できると便利ですが、アプリの一般的な設定画面しか表示できないようです。
vman

4
Intent.FLAG_ACTIVITY_NO_HISTORYは、設定画面内にポップアップが表示され、設定画面を閉じる場合、タブレットで問題のある状況を引き起こすことがあります。このフラグを削除するだけでこの問題は解決します。
16年

2
同時にトーストを表示して、「許可」に移動するようユーザーに指示できます(アプリの残りの部分がユーザーの言語で利用できない場合でも、このメッセージをローカライズすることをお
勧めし

81
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

説明 アプリの詳細設定ページを開きます。ここから、ユーザーは手動で必要な権限を割り当てる必要があります。

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   オプション。設定すると、新しいアクティビティとして設定画面(アクティビティ)が開きます。それ以外の場合は、現在実行中のアクティビティで開かれます。

Uri.fromParts("package", getPackageName(), null)
   URIを準備または作成しますが、getPackageName()-アプリケーションパッケージの名前を返します。

intent.setData(uri)
   これを設定することを忘れないでください。そうでなければ、あなたは得るでしょう android.content.ActivityNotFoundExceptionあなたが意図を設定したので Settings.ACTION_APPLICATION_DETAILS_SETTINGS 、Androidはいくつかの名前で検索することを期待しています。


これが文字通りトップ投票の答えです。なぜこれを複製して元の答えを拡張しないのですか?
トーマスケラー

1
詳しい説明ありがとうございます。
David Refoua

34

代わりに、特定のアプリの一般設定を1行で開くことができます

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));

ビルドの構成方法によっては、getActivity()。getPackageName()を使用してパッケージ名を取得することもできます。
Cory Roy

15

プログラムで許可画面を開くことはできません。代わりに、アプリの設定画面を開くことができます。

コード

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);

出力例

ここに画像の説明を入力してください


1
彼は、権限のページを求めて
Mavenのツ

10

Kotlinあなたがより少ないコードを書きたいなら、これを行うことができます:

fun Context.openAppSystemSettings() {
    startActivity(Intent().apply {
        action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
        data = Uri.fromParts("package", packageName, null)
    })
}

Martin Konecnyの回答に基づく


Kotin拡張機能の適切な使用
David Jarvis

8

Kotlinスタイル。

    startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
        data = Uri.fromParts("package", packageName, null)
    })

5

これはあなたを助けるかもしれません

private void openSettings() {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivityForResult(intent, 101);
}

3

私たちが話している場合はFLYME OS(Meizuの)ONLY権限を持つそれ自身のセキュリティアプリがあります。

それを開くには、次のインテントを使用します。

public static void openFlymeSecurityApp(Activity context) {
    Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
    try {
        context.startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

原因のBuildConfigは、アプリのBuildConfigです。


3

Xamarin Forms Android:

//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
    var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
        Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
    Forms.Context.StartActivity(intent);
}

0

実用的に許可を取得することはできません ...しかし、コード行をtry {} catch {}に配置してアプリを残念ながら停止することをお勧めします...そして、Catch bodyで、ダイアログボックスをナビゲートします他のアプリへの描画の許可を有効にするための小さなチュートリアルのユーザー...次に、[はい]ボタンをクリックしてこのコードを配置します...

 Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(callSettingIntent);

この目的は、他のアプリのドローのリスト直接開いてアクセス許可を管理し、ここからワンクリックで他のアプリのドローにアクセスすることですアクセス許可...これはあなたが探している答えではありません...私のアプリでこれをやっています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.