открыть настройки Android из приложения QT (com.android.settings)

У меня есть приложение для Android в QT. Я хотел бы вызвать настройки Android с кнопки.

Я использовал этот код в Java:

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

Есть ли способ вызвать настройки Android с помощью QT C++?


person Dany19    schedule 29.07.2014    source источник


Ответы (3)


QAndroidJniObject позволяет создавать объекты JNI из кода Qt C++.

Например: чтобы получить активность:

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

Например: чтобы создать новый Intent:

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

Затем вы можете шаг за шагом перевести выполнение кода 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>());
        }
    }
}

...а потом проголосовать! ;-)

person jpo38    schedule 29.07.2014
comment
Действительно помогло... Спасибо! Дал бы сотню плюсов, если бы мог :) - person Barath Ravikumar; 06.08.2015
comment
Просто создайте сто аккаунтов ;-) - person jpo38; 06.08.2015

Принятый ответ не работает с пользовательскими приложениями настроек 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);
}
person Daniel Nicoletti    schedule 19.11.2019

Вот как вы можете открыть сведения о конкретном приложении (по идентификатору пакета) в диспетчере приложений с помощью Qt:

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>());
}
person zenden2k    schedule 12.11.2015