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


Delphi 10.3 Rio で [Android API Level 26 に対応](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E6%96%B0%E6%A9%9F%E8%83%BD#Android_API_.E3.83.AC.E3.83.99.E3.83.AB_26_.E4.BB.A5.E9.99.8D)したので、以前できなかった Level 26 の Android Intent を使ってみました
記述言語は Delphi、使用端末は Nexus 5X (Android ver 8.1.0) です

# Android Developer ドキュメント
[Android Developer - Settings](https://developer.android.com/reference/android/provider/Settings) をご覧ください

# ACTION_APP_NOTIFICATION_SETTINGS

API level 26
通知設定画面

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/4cd12243-3c81-3727-f763-cc58eab32fe5.png)



# ACTION_CHANNEL_NOTIFICATION_SETTINGS

通知詳細設定画面
API level 26

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/33fd2a73-3aea-d82f-d824-fdd346dafe9d.png)


# ACTION_HARD_KEYBOARD_SETTINGS

物理キーボード設定画面
API level 24

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/05b5eb2e-7a8a-2519-92b8-c7544b7b8e5d.png)


# ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS

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

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/2ab5cfaa-0f88-14f2-c9bb-679e5398e32c.png)

# ACTION_MANAGE_DEFAULT_APPS_SETTINGS
API level 24
デフォルトアプリ設定画面

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/302083fd-7124-4f75-c424-93e08606e136.png)


# ACTION_MANAGE_UNKNOWN_APP_SOURCES
API level 26
不明なアプリのインストール設定画面

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/b0403e06-f691-cd9d-1c19-7ddf324e34ac.png)


# ACTION_NIGHT_DISPLAY_SETTINGS
API level 26
夜間モード画面設定画面

が、
In some cases, a matching Activity may not exist, so ensure you safeguard against this.
とあるように、該当するアクティビティが無いことが多い
その場合は、exception が発生する(画面イメージ参照)

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/2ad41ffa-112f-3c20-e8e8-87a2c4b58318.png)

# ACTION_REQUEST_SET_AUTOFILL_SERVICE

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

```pascal
// 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](https://qiita-image-store.s3.amazonaws.com/0/164551/29be8efa-28ee-c796-885a-489f4704c8aa.png)

# 以前書いた Android のインテントアクションと開く画面の記事
以前公開したインテントアクションと開く画面の紹介です
コードはすべて Delphi で記述しています

- [Android のインテントアクションと開く画面 - その 1](https://qiita.com/CYonezawa/items/0a5bbdb2523e736bef3a)
- [Android のインテントアクションと開く画面 - その 2](https://qiita.com/CYonezawa/items/2141c329dd1dacca1052)
- [Android のインテントアクションと開く画面 - その 3](https://qiita.com/CYonezawa/items/d68a960d65080813693e)
- [Android のインテントアクションと開く画面 - その 4](https://qiita.com/CYonezawa/items/7bd18ce521de1a5709de)
- [Android のインテントアクションと開く画面 - その 5](https://qiita.com/CYonezawa/items/9019ad33e4e913d230c9)
- [Android のインテントアクションと開く画面 - その 6](https://qiita.com/CYonezawa/items/e66c27298cf60ee22723)

# で Level 28とかどうよ？
API level 28 - ACTION_DATA_USAGE_SETTINGS
とかの Level 28 以降の定義は無かった...使う場合は自力で作らないと...