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的都試過了,沒卵用6搴场?吒小!歉井!
5.于是想放棄了這個(gè)官方API查查有沒有插件柿祈,csdn上有個(gè),忒貴就不說了,評(píng)論也也有人踩過坑了躏嚎,無法商用蜜自,又是一頓谷歌,終于找到這個(gè)卢佣,真是大好人啊重荠,都不收錢的,還五星評(píng)論虚茶,也沒人說要設(shè)置什么的戈鲁。
6.于是下下來用,結(jié)果:依然沒用`诮小F诺睢!待笑!但是鸣皂, 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先聲明÷γǎ基本可以定性為AndroidManifest的問題贱除。
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)通了G瘴蕖6涸浴!失暂!
總結(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.reibang.com/p/26f7293a635c