Unity开发安卓踩坑集合:覆盖安装/内置升级APK,并弹出打开界面

目录

安卓9.0安装apk,完成后弹出打开界面问题

安卓9.0 默认禁止HTTP请求的问题

AndroidMainifest配置不能打包问题

检查是否有在其他应用上显示的权限


安卓9.0安装apk,完成后弹出打开界面问题

以下为C#代码,纯unity内就可以,不用调用任何jar包

        //https://blog.csdn.net/u014234721/article/details/84071053 适用7.0以上
        //http://www.manew.com/thread-97298-1-1.html 过时
        //path为.apk文件的完整路径
        /// <summary>
        /// 安装apk,完成后弹出打开界面
        /// </summary>
        /// <param name="path">apk路径</param>
        public static void InstallAPP(string path)
        {
            try
            {
                AndroidJavaClass Intent = new AndroidJavaClass("android.content.Intent");
                AndroidJavaClass Uri = new AndroidJavaClass("android.net.Uri");

                AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", Intent.GetStatic<AndroidJavaObject>("ACTION_VIEW"));
                AndroidJavaObject uri = Uri.CallStatic<AndroidJavaObject>("fromFile", new AndroidJavaObject("java.io.File", path.ToJavaString()));

                //apk MIME类型为:"application/vnd.android.package-archive",参考https://blog.csdn.net/boom_jia/article/details/52814914
                intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive".ToJavaString());
                /*
                //解决安卓8.0安装界面不弹出  https://www.cnblogs.com/wuzhang/p/wuzhang20190405.html
                //查询所有符合 intent 跳转目标应用类型的应用,注意此方法必须放置在 setDataAndType 方法之后
                List<ResolveInfo> resolveLists = MainActivity.instance.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
                // 然后全部授权
                for (ResolveInfo resolveInfo : resolveLists)
                {
                    String packageName = resolveInfo.activityInfo.packageName;
                    MainActivity.instance.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                }
                MainActivity.instance.startActivity(intent);
                * */
                AndroidJavaClass PackageManagerClass = new AndroidJavaClass("android.content.pm.PackageManager");
                AndroidJavaObject[] resolveLists = PackageManager.Call<AndroidJavaObject>("queryIntentActivities", intent, PackageManagerClass.GetStatic<int>("MATCH_DEFAULT_ONLY")).Call<AndroidJavaObject[]>("toArray");

                AndroidLogI("resolveLists:" + resolveLists.Length);
                for (int i = 0; i < resolveLists.Length; i++)
                {
                    string packageName = resolveLists[i].Get<AndroidJavaObject>("activityInfo").Get<string>("packageName");

                    int grantUriPer = Intent.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION") | Intent.GetStatic<int>("FLAG_GRANT_WRITE_URI_PERMISSION");
                    UnityActivity.Call("grantUriPermission", packageName, uri, grantUriPer);
                }

                UnityActivity.Call("startActivity", intent);
            }
            catch (Exception e)
            {
                AndroidLogI(e.Message.ToString());
                throw;
            }
        }

        private static AndroidJavaObject _UnityActivity = null;
        /// <summary>
        /// 获取当前App的Activity
        /// </summary>
        /// <returns></returns>
        public static AndroidJavaObject UnityActivity
        {
            get
            {
                if (_UnityActivity == null)
                {
                    _UnityActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
                }
                return _UnityActivity;
            }
        }

        /// <summary>
        /// C# string 转换为Java String
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static AndroidJavaObject ToJavaString(this string msg)
        {
            return new AndroidJavaObject("java.lang.String", msg);
        }


安卓9.0 默认禁止HTTP请求的问题

    <!--Android9.0 默认是禁止所有的HTTP请求的,设置以下代码才可以正常进行网络请求: android:usesCleartextTraffic="true"-->
    <application
        android:usesCleartextTraffic="true">

    </application>


AndroidMainifest配置不能打包问题

问题描述:自己修改了unity项目中的Plugins/Android中的AndroidMainifest文件,有时打包出来AndroidMainifest并没有修改

解决方法:

方法1.打成AAR包会自动合并,不会删除已经调试的内容

方法2.修改unity默认的AndroidMainifest

例如:前面部分为unity的安装路径,D:\Program Files\Unity2017.4.34f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk

 

检查是否有在其他应用上显示的权限

以下为java代码,C#调用动态设置为unity的activity

    //检查是否有在其他应用上显示的权限
    public static boolean checkWindowPermission(Activity myActivity) {
        if (VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(myActivity)) {
            Toast.makeText(myActivity, "当前无权限,请授权!", Toast.LENGTH_LONG).show();
            myActivity.startActivity(new Intent("android.settings.action.MANAGE_OVERLAY_PERMISSION", Uri.parse("package:" + myActivity.getPackageName())));
            return false;
        }
        return true;
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值