6

QTにAndroidアプリケーションがあります。ボタンから Android の設定を呼び出したいと思います。

私はJavaでこのコードを使用しました:

public void usb(View v){
    Intent intent = new Intent();  
    intent.setClassName("com.android.settings", "com.android.settings.DevelopmentSettings");  
    startActivity(intent);  
} 

QT C++ を使用して Android の設定を呼び出す方法はありますか?

4

3 に答える 3

18

QAndroidJniObject を使用すると、Qt C++ コードから JNI オブジェクトを作成できます。

例: アクティビティを取得するには:

QAndroidJniObject activity =  QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");

例: 新しいインテントを作成するには:

QAndroidJniObject intent("android/content/Intent","()V");

その後、C++ から Java コードを段階的に変換して実行することができます....

特定の質問に答えるには、次のコードをコピーして貼り付けてください。

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");   //activity is valid
if ( activity.isValid() )
{
    // Equivalent to Jave code: 'Intent intent = new Intent();'
    QAndroidJniObject intent("android/content/Intent","()V");
    if ( intent.isValid() )
    {
        QAndroidJniObject param1 = QAndroidJniObject::fromString("com.android.settings");
        QAndroidJniObject param2 = QAndroidJniObject::fromString("com.android.settings.DevelopmentSettings");

        if ( param1.isValid() && param2.isValid() )
        {
            // Equivalent to Jave code: 'intent.setClassName("com.android.settings", "com.android.settings.DevelopmentSettings");'
            intent.callObjectMethod("setClassName","(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",param1.object<jobject>(),param2.object<jobject>());

            // Equivalent to Jave code: 'startActivity(intent);'
            activity.callObjectMethod("startActivity","(Landroid/content/Intent;)V",intent.object<jobject>());
        }
    }
}

...そして投票してください!;-)

于 2014-07-29T20:54:45.997 に答える
1

受け入れられた回答は、カスタム Android 設定アプリケーションでは機能せず、新しい Android One 電話でも失敗しました。さらに、開発者ページで開きます。

以下は、最初のページでデフォルト設定アプリケーションを開き、他のページで開くように簡単に変更できる作業コード (Qt 5.12) です。

const QAndroidJniObject ACTION_SETTINGS = QAndroidJniObject::getStaticObjectField("android/provider/Settings",
                                                                                  "ACTION_SETTINGS",
                                                                                  "Ljava/lang/String;");
if (ACTION_SETTINGS.isValid()) {
    const QAndroidIntent intent(ACTION_SETTINGS.toString());
    QtAndroid::startActivity(intent.handle(), 10101);
}
于 2019-11-19T13:11:21.787 に答える
0

これは、Qt を使用して Application Manager で特定のアプリケーションの詳細 (パッケージ ID ごと) を開く方法です。

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");   //activity is valid
if (activity.isValid())
{
    QAndroidJniObject param = QAndroidJniObject::fromString("package:com.example.mycoolapp");
    // Equivalent to Jave code: 'Uri uri = Uri::parse("...");'
    QAndroidJniObject uri = QAndroidJniObject::callStaticObjectMethod("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", param.object<jstring>());
    if (!uri.isValid()) {
        qWarning("Unable to create Uri object");
        return;
    }
    QAndroidJniObject packageName = QAndroidJniObject::fromString("android.settings.APPLICATION_DETAILS_SETTINGS");

    QAndroidJniObject intent("android/content/Intent","(Ljava/lang/String;)V", packageName.object<jstring>());
    if (!intent.isValid()) {
        qWarning("Unable to create Intent object");
        return;
    }
    intent.callObjectMethod("addCategory", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString("android.intent.category.DEFAULT").object<jstring>());
    intent.callObjectMethod("setData", "(Landroid/net/Uri;)Landroid/content/Intent;", uri.object<jobject>());

    activity.callObjectMethod("startActivity","(Landroid/content/Intent;)V",intent.object<jobject>());
}
于 2015-11-12T11:43:27.660 に答える