1. 程式人生 > >【Android開發點滴】解決安卓6.0以上版本不能讀取外部儲存許可權的問題

【Android開發點滴】解決安卓6.0以上版本不能讀取外部儲存許可權的問題

我們都知道當應用程式需要讀取手機內部資料例如圖片,或者儲存資料到手機上例如儲存用加密的登陸密碼等等,這些操作需要在AndroidManifest.xml中註冊以下許可權:

<!--讀寫磁碟的許可權-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

確實如此,可是這樣並不能解決上面的問題。在Android 6.0及以上的系統中以上方法是行不通的,那麼我們又該怎麼做才能獲取這些許可權呢?

首先還是要在AndroidManifest.xml註冊以上兩條許可權,此外定義一個這樣的類叫PermissionUtils:

package com.kaipingzhou.signer.utils;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;

/**
 * Created by 周開平 on 2017/4/2 22:43.
 * qq [email protected]
 * 作用:解決Android 6.0以上系統的許可權問題
 */
public class PermissionUtils { private static String[] PERMISSIONS_CAMERA_AND_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; /** * 解決安卓6.0以上版本不能讀取外部儲存許可權的問題 * * @param
activity * @param requestCode * @return */
public static boolean isGrantExternalRW(Activity activity, int requestCode) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int storagePermission = activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); int cameraPermission = activity.checkSelfPermission(Manifest.permission.CAMERA); if (storagePermission != PackageManager.PERMISSION_GRANTED || cameraPermission != PackageManager.PERMISSION_GRANTED) { activity.requestPermissions(PERMISSIONS_CAMERA_AND_STORAGE, requestCode); return false; } } return true; } }

接下來,也是最重要的一步,呼叫上面的程式碼,下面我給出一個例子,其他都類似。

if (PermissionUtils.isGrantExternalRW(LoginActivity.this, 1)) {
                        //登陸
                        Login(loginId, loginPsd);
}

注意:這樣還不夠,還需要重寫onRequestPermissionsResult()方法:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Login(loginId, loginPsd);
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            ToastUtil.showToast(getApplicationContext(), "您的手機暫不適配哦~");
                        }
                    });
                }
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

這樣就完美地解決了Android 6.0及以上版本不能讀取外部儲存許可權的問題。

相關推薦

Android開發點滴解決6.0以上版本不能讀取外部儲存許可權的問題

我們都知道當應用程式需要讀取手機內部資料例如圖片,或者儲存資料到手機上例如儲存用加密的登陸密碼等等,這些操作需要在AndroidManifest.xml中註冊以下許可權: <!--讀寫磁碟的許可權--> <uses-permissio

Android工具之解決6.0以上版本不能讀取外部儲存許可權的問題

/**      * 解決安卓6.0以上版本不能讀取外部儲存許可權的問題      * @param activity      * @return      */     public static boolean isGrantExternalRW(Activity activity) {        

6.0更新版本出錯:更新包與已安裝應用的簽名不一致,但在應用管理中卻找不到這個已經解除安裝的應用

本人用的是mac系統,手機是華為P10 PLUS,系統是安卓8.0,使用AS進行開發 每次更新版本時,debug版與正式版的簽名不一致,導致安裝失敗,但是如果直接在手機桌面拖拽刪除了debug版,就有可能會提示這個錯誤,因為系統沒有徹底將debug版的安裝包刪除,然而在應用管理中,是根本找不到這

6.0以上動態獲取寫入和讀取許可權

//讀寫許可權 private static String[] PERMISSIONS_STORAGE = { android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifes

Android開發-5界面裝修,五大布局你選誰

比例 技術分享 article 嵌套 content java lin layout mark 前言:假設要開一家店,門店裝修是非常重要的事情。有錢都請專門的建築設計公司來設計裝修,沒錢的僅僅能自己瞎折騰。好不好看全憑自己的感覺。像Android開發。在移動端大家看到的

Android開發經驗android:windowSoftInputMode屬性具體解釋

中一 mtk wid water ren 而是 orien 表示 不能 本文章來自CSDN博客:http://blog.csdn.net/zhaokaiqiang1992。轉載請註明地址! 在前面的一篇文章中,簡單的介紹了一下怎樣實現軟鍵盤不自己主動彈出,使

android開發筆記如何讓ImageButton去掉白色邊框和讓ImageButton具有點選效果

這是我從網上學來的,怕忘記,遂記起來 如何讓ImageButton去掉白色邊框 android:background="#00000000" //把背景變透明放在那一段程式碼裡呢?放在layout裡面的.xml檔案裡 如: <ImageButton a

Android開發日記Popupwindow 完美demo

Popupwindow 完美demo實現 圖示:                                                                                                       關鍵程式碼說明:

iOS開發-29解決方案:TabBar的圖片不顯示,只顯示灰色的正方形

(1)現象 tabbar上的圖片變成一塊正方形的灰色塊塊,原先的圖片沒有了。 (2)原因 tabbar上的圖片本質上不是一個圖片,而是一個形狀圖片。系統對我們使用的圖片也只是把其中的形狀“扣”出來,其餘的背景什麼的都不要。因為我們可能給背景加了顏色,所以系統扣的時候只是把

Android 開發入門android studio 控制檯列印輸出日誌

有些情況下,不方便使用斷點的方式來除錯,而是希望在控制檯列印輸出日誌,使用過Eclipse的同學都知道Java可以使用 System.out.println(""); 來在控制檯列印輸出日誌,但是在android studio中卻是不行的,還是有差別的,那應該用什麼呢?and

Android開發bugDropping event due to no window focus

問題描述: 使用android自帶視訊播放器播放視訊,按返回鍵不能退出這個介面(Android_4.4.4系統); Log如下: 11-25 16:37:31.498: W/ViewRootImpl(27708): Dropping event due to no win

Android 開發入門使用Android模擬器預覽除錯程式

在上篇“走進Android開發的世界,HelloWorld”,我們建立了一個Android 專案 HelloWorld,並演示瞭如何通過USB連線手機檢視執行效果;而如果沒有手機或沒有對應型號的手機,又

Android開發經驗APP的快取檔案到底應該存在哪?看完這篇文章你應該就自己清楚了

只要是需要進行聯網獲取資料的APP,那麼不管是版本更新,還是圖片快取,都會在本地產生快取檔案。那麼,這些快取檔案到底放在什地方合適呢?系統有沒有給我們提供建議的快取位置呢?不同的快取位置有什麼不同呢?今天這篇文章就是主要來說明這個問題的。     首先,我們要知道,在A

Android 開發入門我為什麼要在Android找工作越來越難的時候開始學習它

首先,Android是不是真的找工作越來越難呢?這個可能是大家最關心的。這個受大的經濟環境以及行業發展前景的影響,同時也和個人因素有關。2016-08-26近期一方面是所在的公司招聘Java開發人員很難招到合適的,投簡歷的人很少;而另一方面,經常聽身邊的人說Android、i

Android開發技巧Fragment中獲取Context物件的兩種方法

我們在使用Fragment的時候經常需要傳遞Context型別的引數,【Android用的比較多的就是下面幾個導航按鈕,點選切換fragment(之前Android studio2.0以前是可以new fragment(context)時傳遞Context,但後來升級了studio2.1.2之後,new

Android開發經驗LayoutInflater——80%的Android程式設計師對它並不瞭解甚至錯誤使用

這個標題起的有點誇張哈,但是LayoutInflater這個類的一些用法,在Android開發者使用的過程中,確實存在著一些很普遍的誤區,最起碼我研究的這麼多小專案的原始碼,基本上都在錯誤的使用這個類。今天,看到了一篇文章講LayoutInflater的用法,瞬間感覺自己對

caused by android.system.errnoexception open failed eacces (permission denied)解決方案,6.0(API23)許可權問題

在API23+以上,不止要在AndroidManifest.xml裡面新增許可權 1 <uses-permission android:name="android.permission.REA

Android 開發教程使用Intent傳送簡訊

本章節翻譯自《Beginning-Android-4-Application-Development》,如有翻譯不當的地方,敬請指出。使用SmsManager類,可以在自己編寫的程式內部發送簡訊,而不需要呼叫系統的簡訊應用。然而,有的時候呼叫系統內建的簡訊應用會更加方便。這時

Android 開發入門Android裝置監視器之除錯工具DDMS使用初探

Android Studio提供了一個很實用的工具Android裝置監視器(Android device monitor),該監視器中最常用的一個工具就是DDMS(Dalvik Debug Monitor Service),是 Android 開發環境中的Dalvik虛擬機器

Android開發經驗設定使用者頭像並裁剪,僅僅是這麼簡單?

    在做APP的時候,如果有使用者系統功能,那麼一般都逃不了這個需求,就是給使用者設定頭像,而設定頭像,又包括從拍照和從相簿選取兩個方式,而且選擇了之後,一般又都會要求對影象進行裁剪,讓使用者設定頭像。今天這篇文章就是介紹如何完成這個需求的。    我們首先分析一下需求。