因為筆者之前的游戲需要分享圖片,會請求外部儲存,第一次打開游戲就會出現彈窗:
很多人對這個很敏感,怕你訪問到他們的照片隱私,看到這個權限就拒絕,甚至卸載,實際上我們只是想截屏游戲內容分享給其他玩家,但是賴不住人家不信啊.
如果我們實在想要分享圖片或者需要這個權限,那么我們可以不讓它在啟動的時候彈出,而是點擊分享的時候彈出權限(動態請求權限)
首先,屏蔽權限彈窗,AndroidManifest.xml里面加入
<!-- Unity打包屏蔽android權限彈窗--> <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
接下來是請求權限,在你需要的位置請求
unity端
//AndroidJavaClass是在UnityEngine命名空間里面的
using UnityEngine;
#if UNITY_ANDROID
AndroidJavaClass androidClass = new AndroidJavaClass("com.xxx.xxx.UnityPlayerActivity");//獲取class,填寫正確的Activity
androidClass.CallStatic("requestExternalStorage");//調用靜態方法,requestExternalStorage這個函數名你可以自己取,記住是靜態函數
#endif
java端,寫在你的Activity里面
import android.support.v4.content.PermissionChecker; import android.support.v4.app.ActivityCompat; //前面說過了靜態方法,android.permission.WRITE_EXTERNAL_STORAGE是外部存儲權限,同理其他權限也可以動態請求 public static void requestExternalStorage() { //檢查權限避免重復請求相同權限,參數:activity,權限名 if (PermissionChecker.checkSelfPermission(this, "android.permission.WRITE_EXTERNAL_STORAGE") != 0) { ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 100);//請求權限,參數:activity,權限名,請求碼(不同的權限要求不同的請求碼,可以自己定,比如我這個權限是100,另外的可以填102,103...) } }
這樣就可以避免打開應用出現權限彈窗了,在對應的位置動態請求權限
但是,如果動態請求權限的時候,玩家拒絕了,咋辦
//如果玩家拒絕授權,需要再次申請並說明申請理由 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(100 != requestCode)return;//我們剛才定義的請求碼是100
//給個彈窗告知玩家這個權限不會對他造成影響
if (ActivityCompat.shouldShowRequestPermissionRationale("這個權限不會訪問隱私,求求你開一下嘛", "android.permission.WRITE_EXTERNAL_STORAGE")) {
(new Builder(this)).setMessage(string.storage_permissions_remind)
.setPositiveButton("OK", new OnClickListener() {
public void onClick(DialogInterface var1, int var2) {
//點擊ok,則再次請求
requestExternalStorage();
}
}).setNegativeButton("Cancel", new OnClickListener() {
public void onClick(DialogInterface var1, int var2) {
//點擊cancel,todo
}
}).create().show();
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}