<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                官網 [Android Marshmallow預覽](https://developer.android.com/about/versions/marshmallow) 項目中的 `targetSdkVersion` 改為 `23(6.0)` 。 [TOC] # Android6.0動態權限 ## 簡介 從 Android 6.0(API 級別 23)開始,用戶開始在應用運行時向其授予權限,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為用戶在安裝或更新應用時不需要授予權限。它還讓用戶可以對應用的功能進行更多控制;例如,用戶可以選擇為相機應用提供相機訪問權限,而不提供設備位置的訪問權限。用戶可以隨時進入應用的“Settings”屏幕調用權限。摘自[Android官網:在運行時請求權限](https://developer.android.com/training/permissions/requesting?hl=zh-cn)。 ## targetSdkVerion 我們在開發的時候需要指定`minSdkVersion` 和 `targetSdkVerion`。 >- `minSdkVersion`為app最低適配的版本,低于該版本的手機無法安裝; >- `targetSdkVerion`簡單來說就代表著你的App能夠適配的系統版本,意味著你的App在這個版本的手機上做了充分的 前向 兼容性處理和實際測試。其實我們寫代碼時都是經常干這么一件事,就是 if(Build.VERSION.SDK_INT >= 23) { ... } ,這就是兼容性處理最典型的一個例子。如果你的target設置得越高,其實調用系統提供的API時,所得到的處理也是不一樣的,甚至有些新的API是只有新的系統才有的; ## Android6.0特殊權限[Special Permissions](https://developer.android.com/guide/topics/permissions/overview) 看權限名就知道特殊權限比危險權限更危險,特殊權限需要在manifest中申請并且通過發送Intent讓用戶在設置界面進行勾。 ```java //SYSTEM_ALERT_WINDOW private static final int REQUEST_CODE = 1; private void requestAlertWindowPermission(){ Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:"+ getPackageName())); startActivityForResult(intent, REQUEST_CODE); } @Override protected void onActivityResult(intrequestCode, intresultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_CODE) { if(Settings.canDrawOverlays(this)) { Log.i(LOGTAG, "onActivityResult granted"); } } } //WRITE_SETTINGS 修改系統設置 private static final int REQUEST_CODE_WRITE_SETTINGS = 2; private void requestWriteSettings(){ Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:"+ getPackageName())); startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS ); } @Override protected void onActivityResult(intrequestCode, intresultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_CODE_WRITE_SETTINGS) { if(Settings.System.canWrite(this)) { Log.i(LOGTAG, "onActivityResult write settings granted"); } } } ``` ## Android6.0普通權限[normal permission](https://developer.android.com/guide/topics/permissions/overview) 普通權限不會對用戶的隱私和安全產生太大的風險,所以只需要在AndroidManifest.xml中聲明即可. ## Android6.0危險權限[dangerous permission](https://developer.android.com/guide/topics/permissions/overview) - Normal Permission:寫在xml文件里,那么App安裝時就會默認獲得這些權限,即使是在Android6.0系統的手機上,用戶也無法在安裝后動態取消這些normal權限,這和以前的權限系統是一樣的,不變。 - Dangerous Permission:還是得寫在xml文件里,但是App安裝時具體如果執行授權分以下幾種情況: - 1、targetSDKVersion < 23 & API(手機系統) < 6.0 :安裝時默認獲得權限,且用戶無法在安裝App之后取消權限。 - 3、targetSDKVersion < 23 & API(手機系統) >= 6.0 :安裝時默認獲得權限,但是用戶可以在安裝App完成后動態取消授權( 取消時手機會彈出提醒,告訴用戶這個是為舊版手機打造的應用,讓用戶謹慎操作 )。 - 2、targetSDKVersion >= 23 & API(手機系統) < 6.0 :安裝時默認獲得權限,且用戶無法在安裝App之后取消權限。 - 4、targetSDKVersion >= 23 & API(手機系統) >= 6.0 :安裝時不會獲得權限,可以在運行時向用戶申請權限。用戶授權以后仍然可以在設置界面中取消授權,用戶主動在設置界面取消后,在app運行過程中可能會出現crash。 ## Dangerous permissions and permission groups(危險權限和權限組) > 同一組的任何一個權限被授權了,其他權限也自動被授權。例如,一旦WRITE_CONTENTS被授權了,APP也有READ_CONTACTS和GET_ACCOUNTS了。 |permission-group |dangerous permissions| |:--|:--| |CALENDAR(日歷) |READ_CALENDAR , WRITE_CALENDAR| |CAMERA(照相機) |CAMERA| |CONTACTS(聯系人)| READ_CONTACTS , WRITE_CONTACTS , GET_ACCOUNTS| |LOCATION(位置) |ACCESS_FINE_LOCATION (訪問精細的位置), ACCESS_COARSE_LOCATION(訪問粗略的位置)| |MICROPHONE(麥克風) |RECORD_AUDIO(錄音)| |PHONE(手機) |READ_PHONE_STATE , CALL_PHONE , READ_CALL_LOG , WRITE_CALL_LOG , ADD_VOICEMAIL(添加語音信箱) , USE_SIP(使用SIP協議 , PROCESS_OUTGOING_CALLS(程序撥出電話)| |SENSORS(傳感器)| BODY_SENSORS| |SMS| SEND_SMS , RECEIVE_SMS , READ_SMS , RECEIVE_WAP_PUSH , RECEIVE_MMS| |TORAGE(存儲)| READ_EXTERNAL_STORAGE ,WRITE_EXTERNAL_STORAGE| ## 如何開始動態申請權限 ### 判斷權限是否具有某項權限 ``` ContextCompat.checkSelfPermission(Context context,String permission); ActivityCompat.checkSelfPermission(Context context, String permission); activity.checkSelfPermission(String permission); ``` ### 申請權限 ``` ActivityCompat.requestPermissions(Activity activity,String[] permissions,int requestCode); activity.requestPermissions(String[] permissions, int requestCode); //申請權限回調方法,在Activity或Fragment重寫 onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) ``` ### 是否要提示用戶申請該權限的緣由,sdk小于23恒為false ``` ActivityCompat.shouldShowRequestPermissionRationale(Activity activity, String permission) 0、之前沒有拒絕過此權限的申請(第一次安裝后請求權限前調用):false 1、曾經被拒絕過權限后再調用:true 2、曾經被拒絕過權限且不再詢問后再調用:false 3、系統不允許任何程序獲取該權限:false 4、查看源碼得知安卓6.0以下返回:false 5、總是允許權限后再次調用:false ``` ## 在APP使用過程中,從設置中更改權限 如果應用程序的某個業務邏輯需要使用權限,但用戶沒有選擇開啟。那么最好引導用戶去設置界面修改應用程序的權限。 # XMPermissions ## 導讀 如果我們應用需要動態申請危險權限,按照Google官方問檔我們需要在`activity`或者`fragment`中的`onRequestPermissionsResult `方法進行回調處理。一個執行任務代碼需要分開寫在兩處地方,這我們的代碼會變得很不優雅。 有沒有鏈式、流式或者注解的方式去解決這個問題?有而且很多,以下是我在`github` 上找的`start` 最多的開源庫。 [RxPermissions](https://github.com/tbruyelle/RxPermissions.git) RxJava流式用法; [XXPermissions](https://github.com/getActivity/XXPermissions.git) 鏈式用法; [permissions4m](https://github.com/jokermonn/permissions4m.git) 注解用法; 個人對注解使用不太感冒,而且項目有用到Rxjava的地方。 綜上所述,我在`RxPermissions` 和 `XXPermissions` 基礎上開發了 [XMPermissions](https://github.com/stven0king/XMPermission)。 ## 依賴 ```java implementation 'com.tzx.lib:xmpermission:1.0.0' ``` ## 使用 ```java public interface OnPermission { /** * 本次申請的權限全部通過 */ void hasPermission(); /** * 本次申請的權限沒有全部通過 * @param granteds */ void noPermission(List<PermissionState> granteds); } ``` ### RxJava ```java XMPermissions.with(this) .request(Permission.Group.STORAGE, Permission.Group.PHONE) .subscribe(new SimpleSubscriber<List<PermissionState>>() { @Override public void onNext(List<PermissionState> permissionStates) { for (PermissionState s: permissionStates) { Log.d("tanzhenxing:", s.toString()); } } }); ``` ### 鏈式調用 ```java XMPermissions.with(this) //.constantRequest() //可設置被拒絕后繼續申請,直到用戶授權或者永久拒絕 .permission(Permission.Group.STORAGE, Permission.Group.CALENDAR) .request(new OnPermission() { @Override public void hasPermission() { Toast.makeText(MainActivity.this, "獲取權限成功", Toast.LENGTH_SHORT).show(); } @Override public void noPermission(List<PermissionState> granteds) { for (PermissionState s: granteds) { Log.d("tzx:", s.toString()); } } }); ``` ### 跳轉到應用權限設置頁面 ```java XMPermissions.gotoPermissionSettings(content); ``` # 6.0動態權限適配總結 有了[XMPermissions](https://github.com/stven0king/XMPermission) 適配6.0動態權限就非常簡單了。將`targetVersion`升級到`23`,然后每個使用`儲存、定位、電話、相機、錄音`等危險權限的地方做權限的`check`。 當然這么做非常麻煩像`儲存、定位、電話`這三個權限我們幾乎每次接口訪問都需要獲取,所以我們可以將一些權限申請在應用啟動前置。 - 轉轉:`儲存、定位、電話`前置 - 58同城: `存儲、電話`前置 - 京東: `定位、電話`前置 - 手機淘寶: `電話`前置 - 手機百度: `存儲`前置 > 在進行短信發送和打電話時,不需要權限也可以哦~!我自己測試了4個主流廠商的8款手機。 隨著`Android`系統的不斷更新,后續后問題會繼續同步噠~! ***** 文章到這里就全部講述完啦,若有其他需要交流的可以留言哦~!~! 想閱讀作者的更多文章,可以查看我 [個人博客](http://dandanlove.com/) 和公共號:![振興書城](https://imgconvert.csdnimg.cn/aHR0cDovL3VwbG9hZC1pbWFnZXMuamlhbnNodS5pby91cGxvYWRfaW1hZ2VzLzEzMTk4NzktNjEyYzRjNjZkNDBjZTg1NS5qcGc?x-oss-process=image/format,png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看