unity导入jar包真机运行闪退问题

Posted XGdavey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity导入jar包真机运行闪退问题相关的知识,希望对你有一定的参考价值。

unity导入jar包真机运行闪退问题

本人是unity小白,这次需要搞个apk自动安装的功能,跟着大佬的流程一步步做了,结果在真机一直闪退,最后在自己的反复琢磨下终于解决了问题,这就来向大家分享一下。
1.xml有关问题
之前因为是直接用了大佬的jar包 ,所以不是很懂,然后发现androidManifest.xml里的package 不能用com.unity3d.player。(要用这个应该要把这个包放到Plugins/Android/libs里面才行,应该也包括那些不使用jar包的方法。) 如果是用自己的jar包就要把package改成自己的,比如我的是"com.am1105.installapk"。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.am1105.installapk"
	android:installLocation="preferExternal"
	android:theme="@android:style/Theme.NoTitleBar"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="27" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

    <application
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:debuggable="false">
        <activity android:name="com.am1105.installapk.MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
            <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
        </activity>
         <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.XGdavey.abc.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        <!--
            To support devices using the TI S3D library for stereo mode we must 
            add the following library.
            Devices that require this are: ODG X6 
        -->
        <uses-library android:name="com.ti.s3d" android:required="false" />
        <!--
            To support the ODG R7 in stereo mode we must add the following library.
        -->
        <uses-library android:name="com.osterhoutgroup.api.ext" android:required="false" />
    </application>
</manifest>

<!-- android:installLocation="preferExternal" -->

2.xml注意点
如果是用自己的jar包,下面这个也要改。把com.unity3d.player改成自己的包名,包名不是unity里的,是你jar里的。

 <activity android:name="com.am1105.installapk.MainActivity"

3.不闪退后引入无法跳转安装界面的问题
Plugins/Android/res/xml/目录下的filepaths.xml按大佬的教程是要在path内填路径的,然后就没法跳转安装页面,然后研究了一下发现其实这path不需要填,因为我这个c#脚本函数已经引入path了,这边给出自己的filepaths.xml和有关c#脚本,大家可以参考一下。
在这里插入图片描述下面是我用的c#脚本

    private bool installApp(string apkPath)
    {
        bool success = true;
        loadingText.text = "开始安装";
        // GameObject.Find("TextDebug").GetComponent<Text>().text = "Installing App";
        try
        {
            //Get Activity then Context
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");

            //Get the package Name
            string packageName = unityContext.Call<string>("getPackageName");
            string authority = packageName + ".fileprovider";

            AndroidJavaClass intentObj = new AndroidJavaClass("android.content.Intent");
            string ACTION_VIEW = intentObj.GetStatic<string>("ACTION_VIEW");
            AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);


            int FLAG_ACTIVITY_NEW_TASK = intentObj.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
            int FLAG_GRANT_READ_URI_PERMISSION = intentObj.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");

            //File fileObj = new File(String pathname);
            AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);


            //FileProvider object that will be used to call it static function
            AndroidJavaClass fileProvider = new AndroidJavaClass("android.support.v4.content.FileProvider");
            //getUriForFile(Context context, String authority, File file)
            AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", unityContext, authority, fileObj);

            intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
            intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
            intent.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION);
            currentActivity.Call("startActivity", intent);
            //getText.text = "Success";  
            //GameObject.Find("TextDebug").GetComponent<Text>().text = "Success";
        }
        catch (System.Exception e)
        {
            //GameObject.Find("TextDebug").GetComponent<Text>().text = "Error: " + e.Message;
            success = false;
            loadingText.text = "安装错误!错误报告:"+ e.Message;
        }

        return success;
    }

4.结尾
因为是第一次写文章,有什么不足之处,请多多包含。

以上是关于unity导入jar包真机运行闪退问题的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Android项目真机测试闪退

Android studio 运行到真机上面出现闪退现象,加急,在线等。

Android程序真机调试闪退怎么办

真机环境spotlight光源丢失

在mac 系统,用集成的ADT Eclipse,运行coco2d-x 3.2自带的HelloWorld,真机出现闪退,模拟器出错

Xcode7打包,iOS9真机闪退,如何解决?