今天來講點關於權限設置!
在Android開發中,權限設置(Permission)意指在使用者開啟App後,必須通知使用者"本APP有使用某些功能哦"的行為
咦?很抽象嗎?(゜ロ゜)
那我PO一下這張圖
有印象嗎XD
沒錯,使用Android手機的人應該多少有印象,這個幾乎是在第一次安裝App後一定會出現的東西
只是有時候內容有點不一樣而已
那麼,今天我們要來做的事情就是來寫關於這個申請方法
首先來看一下範例吧
1. 權限是什麼?能吃嗎?好吃嗎?
答案是不能吃
好,結案(╯=▃=)╯︵┻━┻
你倒是告訴我我這裡是什麼時候寫美食專欄了啊?蛤?
好啦這個擺一邊...
喔對了,Android開發者們請直接略過這段,這段講的是廢話~
權限實際上是這樣,他比起功能更像是一種合約
簡單來說Google為了加強針對用戶隱私權的設置,在Android的開發中特別勒令開發者要使用某些功能時務必要告知與用者的一條規矩
就層級來說,客戶就是老闆
而工程師是中階主管,這個中階主管命令程式碼為老闆do something
不過當我們在提供某些服務時,可能會觸及到老闆的一些身家資料
所以中階主管有必要告訴老闆我必須要跟你使用你的某些隱私資料,才能夠提供服務
於是,我們便將這個許可權轉換到使用者手上,使客戶權益不至於損失(被賣掉)
好,我知道對廣大非開發者而言還是有點抽象
那麼我就來講講沒有這個權限機制的話會怎樣
假設到現在還沒有權限機制的話
那麼如果某家軟體公司有心...甚至是工程師有心
我可以在各種軟體上擷取使用者輸入過的資料,並且植入程式,偷偷將你的資料引渡到國外
像是對面國家的中國大陸就很喜歡搞這招
又譬如說,我只是一個理財的App
在帳面上我只是幫你記帳、理財
不過我暗地裡寫錄音程式,使你的手機一直維持常態錄音的狀態
那麼,我就可以無時無刻偷聽你平常講的話,做的事
再加上現在的AI技術,我甚至可以從你的日常中搞到你的銀行密碼、交友狀況、一天清槍幾次、有沒有小三等等...
各位會不會突然不敢用手機了呢XDDDDD
那麼,現在有了權限機制後,也不是說這種事就不會發生了
不過在一定的意義上他可以告訴使用者使用這個App的風險在哪裡,由使用者咎由自取是否接受這些風險
算是一個保護你也保護我的機制,而這樣的機制也提供一個平台來告訴使用者我這些功能是用來做什麼的等等等...
總之我只能說,這是一個對你我都有保障的合約(-‿◦)
那麼權限有哪些呢?
啊...我只能說很多,而且有很多人早就幫我們整理了
我直接給個連結,去參考別人寫的吧
->https://ray650128540340665.wordpress.com/2016/06/16/android-2/
好,廢話講完了,來寫程式吧
2. 撰寫程式
okay,接下來就是實際來撰寫程式
先來看一下專案結構
基本上就一個MainActivity.java還有他對應的介面
而這些都不是重點,所以讓我們開始吧!
2-1. 將權限加入AndroidManifest.xml
首先,請打開AndroidManifest.xml
然後,加入這次我們範例的權限,分別是
Manifest.permission.CAMERA → 相機使用
Manifest.permission.WRITE_EXTERNAL_STORAGE → 使用外部儲存裝置
寫入以下粉底白字的內容
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.noahliu.obtainpermission"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
到這邊為止,基本的權限就完成了
接下來是要跳出視窗的內容
2-2. 跳出詢問視窗告知使用者
接下來把焦點挪到MainActivity.java內
首先,我們先輸入以下內容
public class MainActivity extends AppCompatActivity { TextView tvRes; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvRes = findViewById(R.id.textView_PermissionResult); boolean cameraHasGone = checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; boolean externalHasGone = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String[] permissions; if (!cameraHasGone && !externalHasGone) {//如果兩個權限都未取得 permissions = new String[2]; permissions[0] = Manifest.permission.CAMERA; permissions[1] = Manifest.permission.WRITE_EXTERNAL_STORAGE; } else if (!cameraHasGone) {//如果只有相機權限未取得 permissions = new String[1]; permissions[0] = Manifest.permission.CAMERA; } else if (!externalHasGone) {//如果只有存取權限未取得 permissions = new String[1]; permissions[0] = Manifest.permission.WRITE_EXTERNAL_STORAGE; } else { tvRes.setText("相機權限已取得\n儲存權限已取得"); return; } requestPermissions(permissions, 100); } } }
由於我們有兩個權限,因此要先將權限轉化為string陣列,再以requestPermissions(permissions, 100);發給系統做處理
但是因為我們有要考慮使用者只選一個權限而拒絕另一個權限
因此還要個別抓有哪些權限要再申請
以防使用者耍白痴( ´_ゝ`)
2-3. 取得權限回傳
okay,最後一步了
這邊要取得使用者的選擇,並回傳之
首先,請按crtl+O複寫onRequestPermissionsResult
基本上這裡就是取得權限回傳的部分了
在這個內容,我寫了如下的內容
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); StringBuffer word = new StringBuffer(); switch (permissions.length) { case 1: if (permissions[0].equals(Manifest.permission.CAMERA)) word.append("相機權限"); else word.append("儲存權限"); if (grantResults[0] == 0) word.append("已取得"); else word.append("未取得"); word.append("\n"); if (permissions[0].equals(Manifest.permission.CAMERA)) word.append("儲存權限"); else word.append("相機權限"); word.append("已取得"); break; case 2: for (int i = 0; i < permissions.length; i++) { if (permissions[i].equals(Manifest.permission.CAMERA)) word.append("相機權限"); else word.append("儲存權限"); if (grantResults[i] == 0) word.append("已取得"); else word.append("未取得"); if (i < permissions.length - 1) word.append("\n"); } break; } tvRes.setText(word.toString()); }
這邊分別對我三個標示的回傳說明一下
首先使粉底白字的requestCode
這個是我們先前在requestPermissions()方法中後面的那個數字
再來是紫底白字
這部分是你申請的陣列,也就是我申請相機跟儲存的權限的話,這個回傳便是告訴你申請的內容
最後是綠底白字
這部分跟著permissions的陣列,是告訴你這串這列的權限許可狀態
一般來說,回傳0代表已取得,-1代表未取得
最後,PO一下全部吧
public class MainActivity extends AppCompatActivity { TextView tvRes; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvRes = findViewById(R.id.textView_PermissionResult); boolean cameraHasGone = checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; boolean externalHasGone = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String[] permissions; if (!cameraHasGone && !externalHasGone) {//如果兩個權限都未取得 permissions = new String[2]; permissions[0] = Manifest.permission.CAMERA; permissions[1] = Manifest.permission.WRITE_EXTERNAL_STORAGE; } else if (!cameraHasGone) {//如果只有相機權限未取得 permissions = new String[1]; permissions[0] = Manifest.permission.CAMERA; } else if (!externalHasGone) {//如果只有存取權限未取得 permissions = new String[1]; permissions[0] = Manifest.permission.WRITE_EXTERNAL_STORAGE; } else { tvRes.setText("相機權限已取得\n儲存權限已取得"); return; } requestPermissions(permissions, 100); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); StringBuffer word = new StringBuffer(); switch (permissions.length) { case 1: if (permissions[0].equals(Manifest.permission.CAMERA)) word.append("相機權限"); else word.append("儲存權限"); if (grantResults[0] == 0) word.append("已取得"); else word.append("未取得"); word.append("\n"); if (permissions[0].equals(Manifest.permission.CAMERA)) word.append("儲存權限"); else word.append("相機權限"); word.append("已取得"); break; case 2: for (int i = 0; i < permissions.length; i++) { if (permissions[i].equals(Manifest.permission.CAMERA)) word.append("相機權限"); else word.append("儲存權限"); if (grantResults[i] == 0) word.append("已取得"); else word.append("未取得"); if (i < permissions.length - 1) word.append("\n"); } break; } tvRes.setText(word.toString()); } }
這篇算是我常常在用但從沒PO過的內容XD
其實像是我依前有寫過儲存檔案啊,使用相機等等
這些都有曾經寫過
不過老實講,這個算是所有App的起手式之一
之前我一直覺得這個很多人寫了不差我一個
不過怎麼說呢...果然還自自己寫的自己比較看得懂呢...恩...
好啦,如果這篇文章對你有幫助的話,請記得
最近我把廣告都關掉了...盡量幫我拍拍一下吧QQ
留言列表