Android
Delphi
FMX
FireMonkey

Android のインテントアクションと開く画面 - その 5

Android のアプリ情報を開く で ACTION_APPLICATION_DETAILS_SETTINGS インテントアクションを使って、アプリ情報の設定画面を開くコードを書きました
他にも Android のインテントアクションはありますので、開く画面のスクリーンショットと、Delphi のコードと合わせて紹介します

Android のインテントアクションと開く画面 - その 1
Android のインテントアクションと開く画面 - その 2
Android のインテントアクションと開く画面 - その 3
Android のインテントアクションと開く画面 - その 4

Android Developer のドキュメント

詳しい情報は
https://developer.android.com/reference/android/provider/Settings.html
にあります

ACTION_PRINT_SETTINGS

印刷設定画面

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

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

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

Screenshot_20180206-102759.png

ACTION_PRIVACY_SETTINGS

バックアップとリセット設定画面

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

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

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

Screenshot_20180206-102804.png

ACTION_QUICK_LAUNCH_SETTINGS

クイック起動設定画面
外部接続キーボードと組み合わせて使用するもの(SEARCH キーと同時押しで動作する)
Android 端末単独だとクラッシュする:画面参照

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

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

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

Screenshot_20180206-102835.png

ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

電池の最適化を無視するかどうかの設定画面
使用しているデバイスの OSバージョンに注意! 6.0 以降ではないと使用できません。

また、この機能を使う場合は、AndroidManifest.xml に REQUEST_IGNORE_BATTERY_OPTIMIZATIONS の設定が必要です。
自動的に生成される AndroidManifest.xml を別のところにコピーして、

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

の記述を追加します。
以下は追加した AndroidManifest.xml の一例です。

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.embarcadero.IntentAction"
        android:versionCode="1"
        android:versionName="1.0.0"
        android:installLocation="auto">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.DEVICE_POWER" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="False" 
        android:restoreAnyVersion="False" 
        android:label="IntentAction" 
        android:debuggable="True" 
        android:largeHeap="False"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true">


        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="IntentAction"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="IntentAction" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
        </activity>

        <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />

    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

通常の位置に上書きすると、ビルド時にデフォルトに書き換えられてしまうので、書き換えられないところに AndroidManifest.xml を置いて、配置の設定で入れ替えます。

AndroidDeploy.png

Delphi のコードはこちら

// uses に Androidapi.Helpers, Androidapi.JNI.APP, Androidapi.JNI.Provider
//         Androidapi.JNI.GrapicsContentViewText
//         Androidapi.JNI.Net, Androidapi.JNI.JavaTypes を追加します
// インテントは Intent: JIntent; で定義しています
// URIは uri: string; で定義しています

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

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

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

Screenshot_20180206-102841.png

ACTION_SEARCH_SETTINGS

検索設定画面

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

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

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

Screenshot_20180206-102847.png

ACTION_SECURITY_SETTINGS

セキュリティ設定画面

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

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

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

Screenshot_20180206-102853.png

ACTION_SETTINGS

設定画面

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

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

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

Screenshot_20180206-102859.png

ACTION_SHOW_REGULATORY_INFO

規制情報の表示
使用しているデバイスの OSバージョンに注意! 5.0 以降ではないと使用できません。

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

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

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

Screenshot_20180206-102906.png

ACTION_SOUND_SETTINGS

音と通知設定画面

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

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

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

Screenshot_20180206-102912.png

ACTION_SYNC_SETTINGS

アカウントの同期設定画面

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

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

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

Screenshot_20180206-102917.png

その 6 に続く...