从Qt App(com.android.settings)打开Android设置)
-
21-12-2019 - |
题
我在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设置?
解决方案
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>());
}
}
}
.
...然后投票!; - )
其他提示
这是如何使用Qt中的应用程序管理器中的特定应用程序(通过包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>());
}
. 接受的答案不适用于自定义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);
}
. 不隶属于 StackOverflow