国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Adroid6.0 動態權限申請、封裝 menglong0329

2019-11-09 18:27:13
字體:
來源:轉載
供稿:網友

一、簡單介紹

安卓6.0系統逐漸普及,對于安卓6.0中的SDK也有了一些變化,查看具體的詳情請參考官方文檔http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,當然了,運行時權限也是SDK所發生的變化之一,那么本文介紹一下申請動態權限的步驟及簡單的封裝。

二、動態權限的特點

對于安卓6.0系統所持有的動態權限,主要是分為兩種:

1.普通權限,也就是說不會影響到用戶的隱私的權限,比如說訪問網絡(大家都知道,幾乎每一個APP都需要有訪問網絡的需求,所以說訪問網絡也是必不可少的),還有就是手   機震動等都是普通權限

2.危險權限,也就是說會影響到用戶隱私的權限,比如說打電話,訪問通訊錄等有關用戶隱私的權限都是屬于危險權限,安卓6.0規定有24中危險權限,如下圖:

三、實際案例Demo-打電話的權限申請

1.MainActivity布局文件

<Button    android:onClick="but"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="請求打電話權限"/>2.Manifest清單文件中加入權限
<uses-permission android:name="android.permission.CALL_PHONE" />3.Activity中的邏輯代碼

public void but(View v){//判斷是否已經申請過動態權限了---按鈕的點擊事件中的邏輯代碼/** * 第一個參數為上下文 * 第二個參數為要申請的權限 * */if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){    //沒有申請權限,則去申請權限    /**     * 第二個參數為要申請權限的數據     * 第三個參數為表示是在哪一個地方申請的權限,也就是標識     */    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},1);}else{  //權限申請過了,執行打電話的方法 myPhone();     }}
//撥打電話的方法public void myPhone(){    try{        //申請過權限,撥打電話        Intent intent=new Intent(Intent.ACTION_CALL);        //指定電話號碼        intent.setData(Uri.parse("tel://13121980161"));        startActivity(intent);    }catch (SecurityException e){        e.PRintStackTrace();    }}
//判斷網絡是否請求成功了---重寫Activity的
onRequestPermissionsResult 方法
    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            //此處判斷的是上方的標記“1”            case 1:                //判斷是否申請權限成功                if(grantResults.length>0&&grantResults[0]==                     PackageManager.PERMISSION_GRANTED){                    //權限申請成功,執行打電話的方法                   myPhone();                    Toast.makeText(this, "申請權限成功....", Toast.LENGTH_SHORT).show();                }else{                    Toast.makeText(this, "申請權限失敗....", Toast.LENGTH_SHORT).show();                }                break;            default:                break;        }    }

四、實際案例Demo-申請多個權限------打電話、訪問sd卡

1.在上一個Demo基礎上再添加一個訪問sd卡的權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.Button按鈕中的邏輯

public void but(View view) {    //申請多個權限,首先要創建一個集合,添加幾個權限就必須做幾次判斷    //判斷如果申請過的權限就不在添加到集合當中重復申請了   ArrayList<String> permissionList=new ArrayList<>();    if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!=        PackageManager.PERMISSION_GRANTED){        //添加到集合當中        permissionList.add(Manifest.permission.CALL_PHONE);    }    if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=       PackageManager.PERMISSION_GRANTED){        //添加到集合當中        permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);    }    //判斷集合是否為空,不為空則請求權限    if(!permissionList.isEmpty()){        ActivityCompat.requestPermissions(this,permissionList.toArray(        new String[permissionList.size()]),1);    }else{        doSomething();//此方法中就是一個Toast    }}3.重寫Activity
onRequestPermissionsResult 方法的邏輯
@Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            //此處判斷的是上方的標記“1”            case 1:                  //判斷將要申請的權限大于0個,則申請權限                 if(grantResults.length>0){                    for(int grantResult:grantResults){                        if(grantResult!=PackageManager.PERMISSION_GRANTED){                            Toast.makeText(this, "某一個權限被拒絕了!", Toast.LENGTH_SHORT).show();                            return;                        }                    }                    doSomething();//此方法中就是一個Toast                }                break;            default:                break;        }    }

五、實際案例Demo-申請運行時權限之3種封裝

1.使用一個透明的Activity,當需要申請危險權限時,則創建此Activity,申請之后就可以銷毀掉。

2.使用RxPermission也可以對運行時權限進行封裝

3.使用一個BaseActivity進行封裝,在這里,就主要提供一下用BaseActivity封裝的方法

public class BaseActivity extends AppCompatActivity {    //1.如何讓調用者知道權限是否申請成功    回調    //2.如果不是在Activity中調用,所需的上下文怎么處理   可以通過讓所有的創建的Activity都    //  存到一個集合當中,取其棧頂的Activity作為上下文    private static PermissioLitener mLitener;    private static Activity topActivity;    public static void requestRuntimePermision(String[] permission,                                               PermissioLitener permissioLitener){        //傳過來的回調監聽        mLitener=permissioLitener;        //獲取當前的棧頂Activity        topActivity = listActivity.getActivity();        ArrayList<String> list=new ArrayList<>();        for (String per:permission) {            //如果當前的這個權限沒有被申請            if(ContextCompat.checkSelfPermission(topActivity,per)!= PackageManager.PERMISSION_GRANTED){                //添加到list集合當中                list.add(per);            }        }        //判斷list集合是否為空,不為空則申請權限        if(!list.isEmpty()){            ActivityCompat.requestPermissions(topActivity,list.toArray(new String[list.size()]),1);        }else{            Toast.makeText(topActivity, "所有的權限都已經通過了!", Toast.LENGTH_SHORT).show();            //權限通過的回調方法            mLitener.onGranted();        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            //此處判斷的是上方的標記“1”            case 1:                if(grantResults.length>0){                    ArrayList<String> list=new ArrayList<>();                    for (int i = 0; i < grantResults.length; i++) {                        int grantResult=grantResults[i];                        String permission=permissions[i];                        if(grantResult!=PackageManager.PERMISSION_GRANTED){                            list.add(permission);                        }                    }                    //判斷所有的權限是否都通過了                    if(!list.isEmpty()){                        mLitener.onDenied(list);                    }else{                        mLitener.onGranted();                    }                }                break;            default:                break;        }    }}

//將所有創建的Activity都存于listActivity中public class listActivity {    public static ArrayList<Activity> listActivity=new ArrayList<>();    //添加Activity的方法    public static void addActivity(Activity activity){        listActivity.add(activity);    }    //銷毀Activity的方法    public static void removeActivity(Activity activity){        listActivity.remove(activity);    }    //返回Activity的方法    public static Activity getActivity(){        if(listActivity.isEmpty()){           return null;        }else{            //防止list集合中的Activity被銷毀,返回棧頂Activity           return listActivity.get(listActivity.size()-1);        }    }}
public interface PermissioLitener {    //申請的所有權限都通過了所執行的方法   void onGranted();    //申請的權限有的失敗了,將申請失敗的權限放進集合作為參數提示用戶   void onDenied(ArrayList<String> list);}此時在任意一個類中申請權限時是這樣的

BaseActivity.requestRuntimePermision(new String[]{Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissioLitener() {    @Override    public void onGranted() {        //所有的權限申請成功    }    @Override    public void onDenied(ArrayList<String> list) {        //權限有的申請失敗了,list中為申請失敗的權限    }});好了,到這里呢,大家是不是對運行時權限有了一定的了解。。。。也挺簡單的事吧,加油!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉隆县| 达日县| 招远市| 绥江县| 宁晋县| 德令哈市| 锡林郭勒盟| 榆社县| 安丘市| 财经| 泾川县| 当阳市| 远安县| 青川县| 西乡县| 察隅县| 自贡市| 邯郸县| 安宁市| 玛纳斯县| 盐山县| 桦甸市| 女性| 平昌县| 广灵县| 巴马| 科技| 明光市| 新田县| 庆云县| 上林县| 汉沽区| 凌海市| 舟山市| 宝清县| 开原市| 益阳市| 邹平县| 湄潭县| 嘉荫县| 景德镇市|