web-dev-qa-db-ja.com

Androidマシュマロで特定のアプリの許可画面をプログラムで開く方法は?

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

Intentまたはそれに類するものを介して特定のアプリの許可画面を表示することは可能ですか?

Android M Permission Screen

次のコードでアプリ設定を表示することは可能です - 直接許可画面を開くためのアナログ的な解決策はありますか?

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

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

284

公式のマシュマロの許可ビデオ( 4m 43sのマーク にあります)によると、代わりにアプリケーションの設定ページを開く必要があります(そこからそれは許可ページへのワンクリックです)。

設定ページを開くには、

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

これは不可能です。 私もそうしました。私は、パッケージ名と開始される活動を把握することができました。しかし、最終的には、宣言できない許可がないためにセキュリティ例外が発生します。

更新:

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

    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);
}

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

171
Thomas R.
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は検索する名前を期待しています。

58
singhpradeep

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

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

許可画面を実用的に開くことはできません。代わりに、アプリ設定画面を開くことができます。

コード

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

サンプル出力

enter image description here

5
Vignes

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です。

4
Daniel

Kotlinのコード数を減らしたい場合は、次のようにします。

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

に基づく Martin Konecny answer

3
Ultimo_m

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

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
Sandeep Kumar

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);
}
2
Nick Kovalsky

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

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

この目的は 他のアプリの上に描画のリストを直接開く 権限を管理することです。それからここから他のアプリの上に描画へのワンクリックですPermissions ...私はこれがあなたが探している答えではないことを知っています...しかし、私は私のアプリでこれをやっている...

1
Ashish