【问题标题】:App works on Android 5, but not 6应用程序适用于 Android 5,但不适用于 6
【发布时间】:2017-08-11 09:44:07
【问题描述】:

我正在尝试构建一个应用程序来合并两个 Unity 插件 ARToolKit 和 CameraShot。问题是其中一个插件的清单文件覆盖了另一个清单文件(换句话说,它们都必须位于同一位置)。幸运的是,CameraShot 指定了哪些活动是必要的,我能够制作自定义 Android 清单文件。

该应用在 Android 5 上运行良好,但在我尝试在 Android 6 上保存使用 CameraShot 拍摄的图像后崩溃。我认为这是由于权限授予的更改而发生的,但我已经检查了两台设备上已安装应用的权限它们是相同的。

在 Android 5 上,应用在安装时请求权限,而在 Android 6 上,它在我第一次运行应用时请求权限。

是否有可能获得更多关于为什么该应用在一个操作系统版本而不是另一个操作系统版本上运行的想法?

这是清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.app" android:installLocation="preferExternal">
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
    <activity android:name="org.artoolkit.ar.unity.UnityARPlayerActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTask" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data android:name="android.app.lib_name" android:value="unity" />
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <activity android:name="org.artoolkit.ar.base.camera.CameraPreferencesActivity" />
    <activity android:name="com.astricstore.camerashots.CameraShotActivity" android:configChanges="orientation|keyboardHidden|screenSize" />
    <activity android:name="eu.janmuller.android.simplecropimage.CropImage" android:configChanges="orientation|keyboardHidden|screenSize" />
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature android:name="android.hardware.camera.any" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

我需要补充一点:这不是一个 Android 项目,而是一个 Unity 项目。因此,如果您要参考 Android 功能,请说明并指定如何使用它们,因为我没有使用 Android Studio 的经验。

感谢您的理解!

错误日志:

java.lang.RuntimeException: Unable to resume activity {com.eContent.PandaART/org.artoolkit.ar.unity.UnityARPlayerActivity}: java.lang.ClassCastException: android.view.View cannot be cast to android.view.ViewGroup
                                                                     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
                                                                     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1388)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                     at android.os.Looper.loop(Looper.java:148)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                  Caused by: java.lang.ClassCastException: android.view.View cannot be cast to android.view.ViewGroup
                                                                     at org.artoolkit.ar.unity.UnityARPlayerActivity.onResume(UnityARPlayerActivity.java:137)
                                                                     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                                                                     at android.app.Activity.performResume(Activity.java:6327)
                                                                     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                                                                     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134) 
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1388) 
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                     at android.os.Looper.loop(Looper.java:148) 
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

【问题讨论】:

  • 请粘贴您的错误日志。
  • 在 Android 6.0 中,您向用户询问权限。
  • @lidkxx 如何从 Unity 编辑器获取错误日志?我以为你只能用 Android Studio 来做
  • @BrunoFerreira 我假设我已经通过向清单文件添加权限来做到这一点。正如我所提到的,该应用程序在我第一次运行它时请求权限,如果我批准它们,当我查看应用程序详细信息时它们会正确显示。什么意思?
  • 我的意思是。批准权限。

标签: android unity3d unity5 android-5.0-lollipop android-6.0-marshmallow


【解决方案1】:

我不确定是否能解决您的问题,但大多数情况下,API 23 以上存在权限请求问题。

在上述 API 23 的 Spalsh 屏幕中请求请求权限

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    permission = Settings.System.canWrite(this);
                } else {
                    permission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
                }
                if (!permission) {
                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                        Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                        intent.setData(Uri.parse("package:" + getPackageName()));
                        startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);

                    }
}

【讨论】:

  • 您好,感谢您的快速回复!我认为您给我的代码是针对 Android Studio 的,而我的项目是在 Unity 中的。您能否指导我找到您希望我将其添加到的特定文件?
  • @Andrazaharia 对不起,但我想我不明白 Unity 编辑器和 Android 之间的关系。你真的用 Java/Kotlin 编写你的应用程序吗?我看到你的清单文件看起来像 Android 文件,那么“你的项目在 Unity 中”是什么意思?
  • @AndraZaharia 你看过这里吗? docs.unity3d.com/Manual/TroubleShootingAndroid.html 还有一种方法可以使用 adb logcat 获取日志。
  • @lidkxx,我的意思是我只有一个 Unity 项目,而没有 Android 项目。但我设法将其导出为 gradle 项目并导入 Android Studio。我已经把错误加到主帖里了,如果问的不是太多,你能看看吗?
  • @AndraZaharia 好的,错误日志要好得多:) 我认为问题出在您的 UnityARPlayerActivity 的 XML 中。可能您正在尝试使用需要 ViewGroup(例如 FrameLayout/LinearLayout/RelativeLayout...)的 View,例如。在您将几个视图分组的地方。你也可以粘贴你的 UnityARPlayerActivity XML 吗?或者尝试谷歌“视图不能投射到 ViewGroup”。
【解决方案2】:

请授予运行时权限,或者您可以处理此错误 ....在您的 build.gradle 文件中以 sdk 版本 22 为目标

【讨论】:

  • 您好 :) 谢谢您的回复。我确实授予了运行时权限,但它不起作用。我还在 build.grade 文件中将目标 sdk 设置为 22,但它仍然在 Android 6 上崩溃。还有其他想法吗?
  • 你的错误是类转换异常正确....所以你需要转换这个错误来自哪里......它不是权限问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多