MD,先罵一句,這破玩意搞了一天,能搜到的沒一個(gè)靠譜的。還有Unity,也是個(gè)賊不靠譜的。
起因:
公司沒有安卓/ios開發(fā)人員,我對(duì)安卓也不熟,因此項(xiàng)目做完后,一些權(quán)限獲取,全靠插件內(nèi)部自行調(diào)用,導(dǎo)致出現(xiàn)一個(gè)問題:如果用戶拒絕權(quán)限,會(huì)導(dǎo)致程序卡死/崩潰/出錯(cuò),而一些錄屏插件等等,又沒有寫獲取權(quán)限是否允許和調(diào)用權(quán)限的接口。
解決過程(不想看過程就直接看最后結(jié)論):
1.一開始搜,搜到這篇,如獲至寶啊,舊版本用的多了都沒發(fā)現(xiàn)Unity增加了這個(gè)API。立馬新開一個(gè)項(xiàng)目,調(diào)用一下,跑一下???根本沒卵用!
2.想了想,是不是設(shè)置哪邊需要勾選一下,查了半天設(shè)置,谷歌和unity官方論壇的問答,都沒人說這個(gè)問題。難道是我mac系統(tǒng)的問題???
3.win上裝了個(gè)2019.4.5f1LTS版本,裝了三次才裝上,依舊沒有用!跟mac導(dǎo)出來之后一樣,調(diào)用了沒效果,也沒報(bào)錯(cuò)log。這是逼著用戶去學(xué)安卓?
4.想想會(huì)不會(huì)是安卓版本問題,官網(wǎng)API上說最低設(shè)置API23也就是安卓6.0就行,早就按這個(gè)設(shè)置了,前前后后找了三臺(tái)手機(jī),安卓10的,安卓7的都試過了,沒卵用?。。?!
5.于是想放棄了這個(gè)官方API查查有沒有插件,csdn上有個(gè),忒貴就不說了,評(píng)論也也有人踩過坑了,無法商用,又是一頓谷歌,終于找到這個(gè),真是大好人啊,都不收錢的,還五星評(píng)論,也沒人說要設(shè)置什么的。
6.于是下下來用,結(jié)果:依然沒用?。。?!但是, AndroidRuntimePermissions.OpenSettings();這個(gè)方法倒是意外地可以用,到此為止如果判斷為false,再讓用戶去設(shè)置界面打開,并且用這個(gè)方法直接打開設(shè)置界面就能解決上面的問題了。
但是,我是這么好說話的人嗎?動(dòng)態(tài)去調(diào)用RequestPermission開權(quán)限依舊不能用,不能忍,繼續(xù)查。
7.在安卓端安裝的時(shí)候發(fā)現(xiàn),如果勾選了othersetting中的write permission(寫入權(quán)限)為External(SDCard)的時(shí)候,安裝后選擇拒絕,之后不管調(diào)用官方的API還是插件的API都可以調(diào)用成功。同時(shí)在這個(gè)插件的github最后的描述中有這么一句話:
The following code requests WRITE_EXTERNAL_STORAGE permission (it must be declared in AndroidManifest)
下面的代碼請(qǐng)求WRITE_EXTERNAL_STORAGE權(quán)限(必須在AndroidManifest中聲明)
隨即吐血三升,被官方的API帶偏了都說什么動(dòng)態(tài)獲取權(quán)限不需要在AndroidManifest先聲明?;究梢远ㄐ詾锳ndroidManifest的問題。
8.確定是AndroidManifest的問題后,就查如何改AndroidManifest,百度都說在Plugins/Android文件夾下面放一個(gè)AndroidManifest.xml文件導(dǎo)出的時(shí)候就會(huì)覆蓋Unity默認(rèn)的AndroidManifest,實(shí)測(cè):不論是否勾選External(SDCard),都不行。寫在AndroidManifest的權(quán)限都調(diào)不出來,更別說官方API調(diào)用了。
9.最后逼得沒有辦法了,去修改Unity自帶的默認(rèn)AndroidManifest,把要用的權(quán)限加進(jìn)去,這時(shí)候再去調(diào)用插件或者官方API,都可以調(diào)通了!?。?!
總結(jié):
1.AndroidRuntimePermissions這個(gè)插件,可以一鍵打開設(shè)置界面,還能獲得用戶的拒絕狀態(tài)(是拒絕,還是拒絕且不再提示),這就比Unity自帶API強(qiáng)多了,因此決定直接使用此插件。
這是我整理后的AndroidRuntimePermissions插件
鏈接: https://pan.baidu.com/s/150F1vNC1j3AEHg7Lg2o5Rg 提取碼: 77h9
2.實(shí)測(cè)新版本(Unity2019.2+)存在AndroidManifest無法自動(dòng)整合的問題,在Plugins/Android文件夾下面放AndroidManifest文件根本不起作用(也可能是我自己菜)。因此使用此插件需修改Unity 默認(rèn)AndroidManifest文件,文件路徑為:
Mac系統(tǒng):Unity.app同級(jí)目錄: PlaybackEngines/AndroidPlayer/Apk/
Win系統(tǒng):Unity安裝目錄下面(如果hub安裝的就有hub,非hub安裝的就少hub這一層,可以桌面右鍵圖標(biāo)打開文件所在位置)C:\Program Files\Unity\Hub\Editor\2019.4.5f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
在文件中添加需要的權(quán)限,如:
<uses-permission android:name="android.permission.CAMERA" />
在最后一行</manifest>上面加即可。(注意換項(xiàng)目要把權(quán)限拿去掉呀)
添加后:
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<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" />
</activity>
</application>
<uses-permission android:name="android.permission.CAMERA" />
</manifest>
3.這時(shí)候再去調(diào)用官方的:
Permission.RequestUserPermission("android.permission.CAMERA");
Permission.RequestUserPermission(Permission.Camera);//這兩句一樣
或AndroidRuntimePermissions插件的:
AndroidRuntimePermissions.RequestPermission("android.permission.CAMERA");
安卓權(quán)限分為兩種,一種是普通權(quán)限,一種是涉及用戶隱私的(如通訊錄、相機(jī)、sd卡等)危險(xiǎn)權(quán)限。這里總結(jié)一下Unity常用到的危險(xiǎn)權(quán)限如下:
//android.permission.CAMERA 相機(jī)權(quán)限
//android.permission.RECORD_AUDIO 麥克風(fēng)權(quán)限
//android.permission.READ_EXTERNAL_STORAGE 讀儲(chǔ)存卡,直接在設(shè)置中勾選write permission為External(SDCard)
//android.permission.WRITE_EXTERNAL_STORAGE 寫儲(chǔ)存卡,直接在設(shè)置中勾選write permission為External(SDCard)
普通權(quán)限在AndroidManifest里寫都不需要用戶同意的。
最終我把安卓ios的權(quán)限整合到一個(gè)插件里了:http://www.itdecent.cn/p/26f7293a635c