日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Unity内实现Android APK版本更新

發布時間:2023/12/13 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity内实现Android APK版本更新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近做項目有個需求是要Android應用內強更包體。Google一波直接選了一個android原生開源項目

GitHub - yangchong211/YCUpdateApp: 輕量級版本更新彈窗,彈窗上支持更新進度條,可以設置普通更新或者強制更新。解決8.0以上通知欄不顯示問題,解決7.0以上安裝apk異常,下載完成則會自動提示安裝;下載異常,失敗,錯誤等狀態,支持重啟下載任務;還支持自定義下載路徑。代碼量少,調用簡單……

但是也是需要接入到Unity中,趟了一些小坑記錄下實現步驟

步驟1?

Unity接入插件,兩種方式:

(1)mainTemplateGradle中直接引用,這種方式簡單省事

implementation 'cn.yc:YCUpdateLib:1.1.0'

?(2)下載源碼后自己打出AAR文件給項目引用。這周種方式可以自定義修改內容,比如更新面板的樣式,為了滿足策劃,我選擇的是這種:

步驟2

引用該插件所需的依賴:在mainTemplateGradle中加入

api 'com.liulishuo.filedownloader:library:1.7.5'

這是一個坑,Github使用說明中并沒有寫這點,一直報錯閃退,找了半天看源碼才找到需要引用這么個東西

步驟3

寫個Java調用更新的頁面,我這寫了個UpadateActivity,該Activity的喚起調用由MainActivity喚起

UpdateActivity:

package com.match.fruits;import android.Manifest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.ycbjie.ycupdatelib.*;public class UpdateActivity extends AppCompatActivity {//private static final String TAG = AppConst.TAG_PRE + "GameMainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);desc = getIntent().getStringExtra("Desc");url = getIntent().getStringExtra("Url");packageName = getIntent().getStringExtra("PackageName");//translucentActivity(this);UpdateAPK();}private String desc;private String url;private String packageName;private static final String apkName = "Game";// private static final String firstUrl = "https://xpchy-1301864052.cos.ap-beijing.myqcloud.com/fruitmatch/KuaiShou-0906-1.0.4(1).apk";private static final String[] mPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};public void UpdateAPK(){PermissionUtils.init(this);boolean granted = PermissionUtils.isGranted(mPermission);if(!granted){PermissionUtils permission = PermissionUtils.permission(mPermission);permission.callback(new PermissionUtils.SimpleCallback() {@Overridepublic void onGranted() {}@Overridepublic void onDenied() {PermissionUtils.openAppSettings();Toast.makeText(UpdateActivity.this,"請允許更新權限",Toast.LENGTH_SHORT).show();}});permission.request();}//設置自定義下載文件路徑// AppUpdateUtils.APP_UPDATE_DOWN_APK_PATH = "apk" + File.separator + "downApk";UpdateFragment.showFragment(UpdateActivity.this,true, url, apkName, desc, packageName ,null);}}

MainActivity或其他總控代碼中調用喚起強更功能的代碼,該函數由Unity中觸發:

public void UpdateAPK(String url, String desc, String packageName){Intent intent = new Intent(GameMainActivity.this, UpdateActivity.class);intent.putExtra("Desc", desc);intent.putExtra("Url", url);intent.putExtra("PackageName", packageName);startActivity(intent);}

?步驟4

配置UpadteActivity:

?為了該Activity透明能看到游戲背景(Unity主Activity),所以自己寫了個Style,在Style.xml中加入:

<style name="AppFullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowNoTitle">true</item><item name="android:windowActionBar">false</item><item name="android:windowFullscreen">true</item><item name="android:windowContentOverlay">@null</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:colorBackgroundCacheHint">@null</item><item name="android:windowIsTranslucent">true</item></style>

Androidmanifet中加入該Activity并引用Style的透明theme?

?注意一定要用的是Theme.AppCompt,否則會報錯崩潰,參考以下解答:填坑

android - How to fix: "You need to use a Theme.AppCompat theme (or descendant) with this activity" - Stack Overflow

Android how to get AppCompat.Translucent type theme with support actionbar? - Stack Overflow

步驟5

填坑報錯:Using WebView from more than one process at once with the same data directory is not supported

在主Application中加入(如果自己沒自定義Application,那就放在總控代碼里,反正核心是要設置webview)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {String processName = getProcessName(this);String packageName = this.getPackageName();if (!packageName.equals(processName)) {WebView.setDataDirectorySuffix(processName);}}private String getProcessName(Context context) {if (context == null) return null;ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {if (processInfo.pid == android.os.Process.myPid()) {return processInfo.processName;}}return null;}

問題參考以下解答:?

Using WebView from more than one process at once with the same data directory is not supported_幻影浪子-CSDN博客

步驟6?

寫Unity代碼,調用Java層中的UpdateAPK(String url, String desc, String packageName)函數實現更新包,Unity中C#代碼:

public void UpdateAPK(string url, string desc, string packageName){AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("UpdateAPK", url, desc, packageName);}

步驟7

把aar和UpdateActivity等文件放到Unity中的Plugins/Android對應目錄下,出包測試,接入成功

?

總結:坑還是挺多,得挨個趟坑,后續抽時間整理個Demo傳到Github上

總結

以上是生活随笔為你收集整理的Unity内实现Android APK版本更新的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。