unity 在Android平臺下喚起安裝界面(適配7.0以上系統(tǒng))

一、開始之前

在unity打包的apk中,一般來說,調(diào)用Android方式,通過類似

obj = new AndroidJavaObject("android.content.Intent")
obj .Call<方法返回類型>("方法名", 參數(shù));

這樣的方式調(diào)用來實現(xiàn)一些簡單的功能,但是當實現(xiàn)比較復雜的功能或者代碼量比較多的時候就需要考慮使用jar包或者在unity中引用庫。由于是在unity中引用,所以jar包和引用庫的制作和集成和原生開發(fā)有少許不同:

1.1 制作jar包并使用

以在eclipse環(huán)境下制作為例:

  1. 首先在C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes目錄下拿到class.jar放入jar工程中
  2. 繼承UnityPlayerActivity,如果重寫onCreate方法去掉其中的setContentView()
  3. 編寫自己的功能接口(繼承了的好處就是在編寫時候可以用UnityPlayer.currentActivity當作上下文,否則就用UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity")獲取上下文)
  4. 用Export導出Jar放入Unity 的 Assets/plugins/Android/下
  5. 在C#腳本中通過AndroidJavaClass obj = new AndroidJavaClass("類的全路徑"); obj.CallStatic<接口返回類型>("接口名", 參數(shù) );調(diào)用
1.2 制作引用庫

當接口功能中涉及一些權(quán)限,資源使用的時候僅僅有jar包是不夠的,那么怎么把資源也同時引用進來呢


unity下的引用庫目錄結(jié)構(gòu):
Assets
| Plugins
|--MyCustomResources
|-- libs
|-- res
| |--- values
| |--- values-en
|-- project.properties
|-- Androidmanifest.xml

注意 project.properties和Androidmanifest.xml不能少,否則不能成功打包,其他資源參考Android工程結(jié)構(gòu)目錄添加

二、喚起安裝界面

在android 7.0之前,實現(xiàn)喚起僅需要就能實現(xiàn)

Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(install);

7.0之后由于系統(tǒng)加入了訪問限制,系統(tǒng)的安裝程序直接訪問不了安裝包,

對于面向 Android 7.0 的應(yīng)用,Android 框架執(zhí)行的 StrictMode API 政策禁止在您的應(yīng)用外部公開 file:// URI。
如果一項包含文件 URI 的 intent 離開您的應(yīng)用,則應(yīng)用出現(xiàn)故障,并出現(xiàn) FileUriExposedException 異常。
要在應(yīng)用間共享文件,您應(yīng)發(fā)送一項 content:// URI,并授予 URI 臨時訪問權(quán)限。
進行此授權(quán)的最簡單方式是使用 FileProvider 類。如需了解有關(guān)權(quán)限和共享文件的詳細信息,請參閱共享文件。
--摘自Android developer

由于這個原因上面的操作在7.0以上設(shè)備上就毫無反映,雖然系統(tǒng)的安全更加可靠了,對于開發(fā)者來說變得麻煩了。。。 那就只好配置本應(yīng)用的provider來解決了

      <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="packagename.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

filepaths文件、

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="apk"/>
    </paths>
</resources>

應(yīng)用下載的目標位置在存儲根目錄,在其他目錄要更改paths節(jié)點下的內(nèi)容

更改后的喚起安裝頁面的實現(xiàn)

                  if(Build.VERSION.SDK_INT>=24) {
                        Uri apkUri = FileProvider.getUriForFile(UnityPlayer.currentActivity, UnityPlayer.currentActivity.getPackageName() + ".fileProvider", file);
                        Intent install = new Intent(Intent.ACTION_VIEW);
                        install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        install.setDataAndType(apkUri, "application/vnd.android.package-archive");
                        UnityPlayer.currentActivity.startActivity(install);
                    } else{
                        Intent install = new Intent(Intent.ACTION_VIEW);
                        install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                        install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        UnityPlayer.currentActivity.startActivity(install);
                    }
三、最后

Android的安裝功能實現(xiàn)起來并不復雜,主要是怎么在unity下調(diào)用Android的方法以及類庫的引用方式才是需要學習和記錄的地方,最后希望能對閱讀者有所幫助!

plugins下載:https://pan.baidu.com/s/1Hde5zFwI44FsNUYcCVYY4Q 密碼:654a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,983評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • 雷霆今日在主場以115-113戰(zhàn)勝了火箭,扳回一城,他們現(xiàn)在大比分仍然以1-2落后于火箭。 “我們一開場要打得好一...
    Sandy體育風云閱讀 194評論 0 0
  • 就像我偶爾發(fā)神經(jīng)的時候,會反復的說,其實你知道煩惱會解決煩惱,其實你知道煩惱會解決煩惱,其實你知道煩惱會解決煩惱,...
    李阿冰閱讀 408評論 0 2
  • 今天的時政文章主題“傳銷—李文星之死”。我在想,多可惜呀,年輕的大學生就這么死了,怎么就這么簡單呢,他...
    尋覓美麗閱讀 373評論 0 0

友情鏈接更多精彩內(nèi)容