Posted at

Android のインテントアクションと開く画面 - Level 26 対応編

Delphi 10.3 Rio で Android API Level 26 に対応したので、以前できなかった Level 26 の Android Intent を使ってみました

記述言語は Delphi、使用端末は Nexus 5X (Android ver 8.1.0) です


Android Developer ドキュメント

Android Developer - Settings をご覧ください


ACTION_APP_NOTIFICATION_SETTINGS

API level 26

通知設定画面

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_APP_NOTIFICATION_SETTINGS);
Intent.putExtra(TJSettings.JavaClass.EXTRA_APP_PACKAGE, TAndroidHelper.Context.getPackageName);

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181218-154402.png


ACTION_CHANNEL_NOTIFICATION_SETTINGS

通知詳細設定画面

API level 26

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています
// Notification を使うので、フォーム上に TNotificationCenter コンポーネントを置いています
// チャンネルは Channel: TChannel; で定義しています
// 作業用として chennel_id, channel_title: string; を定義
// 作業用として channel_importance: TImportance; を定義

// 作業用の変数に値を代入
channel_id := 'SampleChannel';
channel_title := 'SampleTitle';
chennel_importance := TImportance.Default;

// Channel を生成して値をセットします
Channel := NotificationCenter1.CreateChannel;
Channel.ID := channel_id;
Chennel.Title := channel_title;
Channel.Importance := channel_importance;

// 値をセットした Channel で通知チャンネルを生成します
NotificationCenter1.CreateOrUpdateChannel(Channel);

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
Intent.putExtra(TJSettings.JavaClass.EXTRA_APP_PACKAGE, TAndroidHelper.Context.getPackageName);
Intent.putExtra(TJSettings.JavaClass.EXTRA_CHANNEL_ID, StringToJString(channel_id));

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181219-172424.png


ACTION_HARD_KEYBOARD_SETTINGS

物理キーボード設定画面

API level 24

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_HARD_KEYBOARD_SETTINGS);

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181219-143929.png


ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS

アプリのデータ使用量設定画面

API level 24

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています
// URIは uri: string; で定義しています

// uri にパッケージ名をセットします
// ここでは getPackageName を使って自分自身のパッケージ名を取得しています
uri := 'package:' + JStringToString(TAndroidHelper.Context.getPackageName);

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS, StrToJURI(uri));

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181219-144432.png


ACTION_MANAGE_DEFAULT_APPS_SETTINGS

API level 24

デフォルトアプリ設定画面

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181217-165913.png


ACTION_MANAGE_UNKNOWN_APP_SOURCES

API level 26

不明なアプリのインストール設定画面

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています
// URIは uri: string; で定義しています

// uri にパッケージ名をセットします
// ここでは getPackageName を使って自分自身のパッケージ名を取得しています
uri := 'package:' + JStringToString(TAndroidHelper.Context.getPackageName);

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_UNKNOWN_APP_SOURCES, StrToJURI(uri));

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181217-174917.png


ACTION_NIGHT_DISPLAY_SETTINGS

API level 26

夜間モード画面設定画面

が、

In some cases, a matching Activity may not exist, so ensure you safeguard against this.

とあるように、該当するアクティビティが無いことが多い

その場合は、exception が発生する(画面イメージ参照)

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_NIGHT_DISPLAY_SETTINGS);

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181218-132135.png


ACTION_REQUEST_SET_AUTOFILL_SERVICE

自動入力サービス設定画面

API level 26

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider

// Androidapi.JNI.GrapicsContentViewText を追加します
// インテントは Intent: JIntent; で定義しています
// URIは uri: string; で定義しています

// uri にパッケージ名をセットします
// ここでは getPackageName を使って自分自身のパッケージ名を取得しています
uri := 'package:' + JStringToString(TAndroidHelper.Context.getPackageName);

// 目的のインテントアクションのインテントを作成します
Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_REQUEST_SET_AUTOFILL_SERVICE, StrToJURI(uri));

// startActivity を使ってインテントを飛ばします。
TAndroidHelper.Activity.startActivity(Intent);

Screenshot_20181219-144238.png


以前書いた Android のインテントアクションと開く画面の記事

以前公開したインテントアクションと開く画面の紹介です

コードはすべて Delphi で記述しています


で Level 28とかどうよ?

API level 28 - ACTION_DATA_USAGE_SETTINGS

とかの Level 28 以降の定義は無かった...使う場合は自力で作らないと...