android - Qt Android 应用程序因“无法启动活动 GrantPermissionsActivity”而崩溃
问题描述
我正在使用 Qt 开发一个 Android 应用程序。之前在Android下已经构建并运行成功。现在经过一些代码更改(主要是添加相机视图),相同的构建过程会导致以下症状:
使用完全相同的代码,应用程序可以像桌面应用程序一样构建和运行。
该应用程序在 Android 下构建和安装,但在应用程序启动时它会显示一个对话框“不幸的是,包安装程序已停止”并关闭。
应用程序启动时的崩溃伴随着
adb logcat
输出中的以下日志消息(为清楚起见而缩写):
I ActivityManager: START u0 {
act=android.content.pm.action.REQUEST_PERMISSIONS
pkg=com.google.android.packageinstaller
cmp=com.google.android.packageinstaller/
com.android.packageinstaller.permission.ui.GrantPermissionsActivity
(has extras)
} from uid 10178 on display 0
I ActivityManager: Start proc 21696:com.google.android.packageinstaller/u0a27
for activity com.google.android.packageinstaller/
com.android.packageinstaller.permission.ui.GrantPermissionsActivity
W System: ClassLoader referenced unknown path:
/system/priv-app/GooglePackageInstaller/lib/arm
D AndroidRuntime: Shutting down VM
E AndroidRuntime: FATAL EXCEPTION: main
E AndroidRuntime: Process: com.google.android.packageinstaller, PID: 21696
E AndroidRuntime: java.lang.RuntimeException:
Unable to start activity ComponentInfo{
com.google.android.packageinstaller/
com.android.packageinstaller.permission.ui.GrantPermissionsActivity
}: java.lang.NullPointerException: Attempt to get length of null array
E AndroidRuntime:
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
[...]
E AndroidRuntime: Caused by:
java.lang.NullPointerException: Attempt to get length of null array
E AndroidRuntime:
at com.android.packageinstaller.permission.ui.GrantPermissionsActivity.
computePermissionGrantState(GrantPermissionsActivity.java:293)
[...]
W ActivityManager: Force finishing activity com.google.android.packageinstaller/
com.android.packageinstaller.permission.ui.GrantPermissionsActivity
在哪里寻找解决这个问题?
解决方案
当任何 Android 应用程序没有声明它需要运行的一个或多个应用程序权限时,就会出现这些确切的症状。
只要应用程序不需要任何特殊权限,它就会在 Android 下运行而无需声明任何权限。但是当添加需要额外权限的代码(例如访问相机)并且没有在AndroidManifest.xml
文件中声明该权限时,它会在启动时崩溃并显示症状。
当您使用 Qt 进行 Android 开发时,您可以让 Qt 为您生成正确的权限列表,如下所示:确保包含标签内AndroidManifest.xml
的字符串:<!-- %%INSERT_PERMISSIONS -->
<manifest>
<?xml version="1.0"?>
<manifest ... >
<!-- ...more code... -->
<!-- %%INSERT_PERMISSIONS -->
<!-- ...more code... -->
</manifest>
现在,androiddeployqt
将从应用程序的 Qt 库依赖项中获取权限,并在构建 Android APK 文件时将它们插入该位置。或者,您也可以手动将权限列表放入同一位置,并省略<!-- %%INSERT_PERMISSIONS -->
.
其他原因不太可能。特别是,您看到这个错误的事实证明您的自定义AndroidManifest.xml
已经在使用中——因为如果没有,AndroidManifest.xml
将使用 Qt 的模板 for,它已经包含<!-- %%INSERT_PERMISSIONS -->
(参见 参考资料${QT_BASE_DIR}/${QT_VARIANT_DIR}/src/android/templates/
)。
推荐阅读
- c# - WPF 的自定义滑块控件
- java - 如何在android studio中删除android应用程序上的绿条
- windows - 批处理文件:在 FOR 循环中跳过以 _ 开头的文件夹
- sql - May I know why its impossible for an index to speed up query processing for certain queries?
- c - 你能在 Linux 中从自身内部更改线程的名称吗?
- c++ - c++流的理解使用问题
- python - requests.exceptions.SSLError:HTTPSConnectionPool
- numpy - 添加到项目,多次出现
- ios - 如何让导航栏按钮与导航栏标题位于同一行?
- javascript - 如何使用 jasmin 和 karma 测试外部 css 属性