首页 > 解决方案 > Qt Android 应用程序因“无法启动活动 GrantPermissionsActivity”而崩溃

问题描述

我正在使用 Qt 开发一个 Android 应用程序。之前在Android下已经构建并运行成功。现在经过一些代码更改(主要是添加相机视图),相同的构建过程会导致以下症状:

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

在哪里寻找解决这个问题?

标签: androidqtandroid-permissions

解决方案


当任何 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/)。


推荐阅读