1. 程式人生 > >Android提示使用者獲取相應手機許可權

Android提示使用者獲取相應手機許可權

一,簡介

Android 6.0 為了保護使用者隱私,將一些許可權的申請放在了應用執行的時候去申請, 比如以往的開發中,開發人員只需要將需要的許可權在清單檔案中配置即可,安裝後用戶可以在設定中的應用資訊中看到:XX應用以獲取****許可權。使用者點選可以選擇給應用相應的許可權。此前的應用許可權使用者可以選擇允許、提醒和拒絕。在安裝的時候使用者是已經知道應用需要的許可權的。但是這樣存在一個問題,就是使用者在安裝的時候,應用需要的許可權十分的多(有些開發者為了省事,會請求一些不必要的許可權或者請求全部的許可權),這個時候使用者在安裝應用的時候也許並沒有發現某些侵犯自己隱私的許可權請求,安裝之後才發現自己的隱私資料被竊取。其實Android6.0 動態許可權一方面是為了廣大使用者考慮,另一方面其實是Google為了避免一些不必要的官司。下面就說一下Android6.0對許可權的分割:

二,一些許可權知識

下面是對許可權的總結:(此處內容摘抄自:http://blog.csdn.net/u011200604/article/details/52874599)

首先是大家感興趣的危險許可權

這類許可權需要在需要的時候,需要我們動態申請,比如:當我們需要開啟相機拍攝照片的時候需要我們通過程式碼的方式在需要的地方去申請許可權。Android6.0中許可權問題中我們需要注意的是:

1:由於許可權API的問題,我們的Actiivty最好是AppCompatActivity型別的,也就是說在你的BaseActivity需要繼承AppCompatActivity

2:許可權是分組的,同一組的許可權申請其中一個,同組的許可權就全部都申請了

特殊許可權 組:

CALENDAR 日曆

CAMERA 相機

CONTACTS 聯絡人

LOCATION 定位

MICROPHONE 麥克相關,比如錄音

PHONE 手機狀態

SENSORS 感測器

SMS 簡訊

STORAGE 儲存許可權

具體的許可權分組情況如下表:

以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就預設整組許可權都可以使用了。
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
 
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
 
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
 
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
 
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
 
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
 
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
 
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
 
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS

普通許可權的總結:
ACCESS_LOCATION_EXTRA_COMMANDS	定位許可權
 
ACCESS_NETWORK_STATE	網路狀態許可權
 
ACCESS_NOTIFICATION_POLICY	通知 APP通知顯示在狀態列
 
ACCESS_WIFI_STATE	WiFi狀態許可權
 
BLUETOOTH	使用藍芽許可權
 
BLUETOOTH_ADMIN	控制藍芽開關
 
BROADCAST_STICKY	粘性廣播
 
CHANGE_NETWORK_STATE	改變網路狀態
 
CHANGE_WIFI_MULTICAST_STATE	改變WiFi多播狀態,應該是控制手機熱點(猜測)
 
CHANGE_WIFI_STATE	控制WiFi開關,改變WiFi狀態
 
DISABLE_KEYGUARD	改變鍵盤為不可用
 
EXPAND_STATUS_BAR	擴充套件bar的狀態
 
GET_PACKAGE_SIZE	獲取應用安裝包大小
 
INTERNET	網路許可權
 
KILL_BACKGROUND_PROCESSES	殺死後臺程序
 
MODIFY_AUDIO_SETTINGS	改變音訊輸出設定
 
NFC	支付
 
READ_SYNC_SETTINGS	獲取手機設定資訊
 
READ_SYNC_STATS	資料統計
 
RECEIVE_BOOT_COMPLETED	監聽啟動廣播
 
REORDER_TASKS	建立新棧
 
REQUEST_INSTALL_PACKAGES	安裝應用程式
 
SET_TIME_ZONE	允許應用程式設定系統時間區域
 
SET_WALLPAPER	設定桌布
 
SET_WALLPAPER_HINTS	設定桌布上的提示資訊,個性化語言
 
TRANSMIT_IR	紅外發射
 
USE_FINGERPRINT	指紋識別
 
VIBRATE	震動
 
WAKE_LOCK	鎖屏
 
WRITE_SYNC_SETTINGS	改變設定
 
SET_ALARM	設定警告提示
 
INSTALL_SHORTCUT	建立快捷方式
 
UNINSTALL_SHORTCUT	刪除快捷方式
 
以上這些只是普通許可權,我們開發的時候,正常使用就行了,需要的許可權在清單檔案配置即可

三,demo

1,效果,分兩種情況,

第一種:點選允許


第二種:點選拒絕,並再次點選拒絕+不在詢問

   

2,程式碼:

檢視層:

permission.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_marginTop="200dp"
        android:id="@+id/btn_get2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:onClick="get"
        android:text="讀取手機記憶體"/>

</LinearLayout>

許可權:

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

testPermission.java

public class testPermission extends Activity {


    private static final int REQUEST_EXTERNAL_STORAGE = 1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.permission);

    }

    public void get(View v){

        String[] permissions;
       //讀取記憶體許可權
                permissions = new String[]{
                        Manifest.permission.READ_EXTERNAL_STORAGE
                };
                if (checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) {
                    //如果已經獲得許可權
                    String   dir= Environment.getExternalStorageDirectory().getAbsolutePath();
                    Intent intent=new Intent(testPermission.this,FileManager.class);
                    intent.putExtra("dir",dir);
                    intent.putExtra("title","檔案管理");
                    startActivity(intent);

                    }else{
                    //否則去獲取許可權
                    getPermission(Manifest.permission.READ_EXTERNAL_STORAGE,permissions);
                }

    }


    //檢查某個許可權是否已經獲得
    private boolean checkPermission(String permission){
        //檢查許可權(NEED_PERMISSION)是否被授權 PackageManager.PERMISSION_GRANTED表示同意授權
        if (ActivityCompat.checkSelfPermission(this, permission)
                == PackageManager.PERMISSION_GRANTED)
            return true;
        else
            return false;
    }

    //獲取許可權
    private void getPermission(String permission,String [] permissions) {

        //申請許可權
        ActivityCompat.requestPermissions(
                this,
                permissions,
                REQUEST_EXTERNAL_STORAGE);

        //使用者已經拒絕過一次,再次彈出許可權申請對話方塊需要給使用者一個解釋
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission))
            Toast.makeText(this, "請開通相關許可權,否則無法正常使用本應用!", Toast.LENGTH_SHORT).show();

    }



    /**
     * 一個或多個許可權請求結果回撥
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     *//當點選了不在詢問,但是想要實現某個功能,必須要用到許可權,可以提示使用者,引導使用者去設定
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        boolean hasAllGranted = true;
        for (int i = 0; i < grantResults.length; ++i) {
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                hasAllGranted = false;
                //在使用者已經拒絕授權的情況下,如果shouldShowRequestPermissionRationale返回false則
                // 可以推斷出使用者選擇了“不在提示”選項,在這種情況下需要引導使用者至設定頁手動授權
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                    //解釋原因,並且引導使用者至設定頁手動授權
                    new AlertDialog.Builder(this)
                            .setMessage("\r\n" +
                                    "獲取相關許可權失敗:xxxxxx,將導致部分功能無法正常使用,需要到設定頁面手動授權")
                            .setPositiveButton("去授權", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //引導使用者至設定頁手動授權
                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
                                    intent.setData(uri);
                                    startActivity(intent);
                                }
                            })
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //引導使用者手動授權,許可權請求失敗
                                    Toast.makeText(testPermission.this,"許可權獲取失敗",Toast.LENGTH_SHORT).show();
                                }
                            }).setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialog) {
                            //引導使用者手動授權,許可權請求失敗
                        }
                    }).show();

                } else {
                    //許可權請求失敗,但未選中“不再提示”選項
                }
                break;
            }
        }
        if (hasAllGranted) {

        }
    }

}

FileManager.java//當權限獲取成功時,跳到此activity;

public class FileManager extends Activity {

    ListView listView;
    TextView title;
    String dir;
    //用存放路勁
    FileAdapter adapter;
    //介面卡
    List<File> dateList;
    //File 資料
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.file_manager);

        findVById();
        init();
        //初始化
    }
    private void findVById() {
        listView=(ListView)findViewById(R.id.file_listview);
        title=(TextView)findViewById(R.id.file_title);
    }
    //初始化
    private void init() {

        Intent intent=getIntent();
        //獲取Intent的,接收activity傳來的值,

        dir= intent.getStringExtra("dir");
        //如果為null,dir的值為 :Environment.getExternalStorageDirectory().getAbsolutePath();
        //這個路勁就是一般開啟手機檔案管理檔案目錄的路勁
        if (dir!=null)
            ;
        else
            dir= Environment.getExternalStorageDirectory().getAbsolutePath();

        //獲取title:讓其顯示檔案路勁:如Android>data>com......
        if(intent.getStringExtra("title")!=null)
            title.setText(intent.getStringExtra("title"));
        else
            title.setText("檔案管理");

        //為listView註冊上下文選單,當長按某一個檔案出現選單:
       this.registerForContextMenu(listView);

        dateList=new ArrayList<>();
        adapter=new FileAdapter(this,getDate());
        listView.setAdapter(adapter);

        //listView 點選事件,當點選的檔案為目錄時,
        // 把dir的值賦值為:dir+點選的目錄,再次跳到此頁,既可以達到迴圈,不要再去新建一個activity在現實:
        // intent.putExtra("dir",dir+"/"+dateList.get(i).getName());
        //intent.putExtra("title",title.getText()+">"+dateList.get(i).getName());

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if(dateList.get(i).isDirectory())
                {
                    Intent intent=new Intent(FileManager.this,FileManager.class);
                    intent.putExtra("dir",dir+"/"+dateList.get(i).getName());
                    intent.putExtra("title",title.getText()+">"+dateList.get(i).getName());
                    startActivity(intent);
                }
            }
        });
    }



    //為上下文選單新增選單項
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("檔案操作");
        menu.setHeaderIcon(R.drawable.ic_brightness_high_black_24dp);
        menu.add(1,1,1,"複製");
        menu.add(1,2,1,"貼上");
        menu.add(1,3,1,"剪下");
        menu.add(1,4,1,"重新命名");

    }

    //選中選單項點選事件,這裡就Toast一下,
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case 1:
                Toast.makeText(FileManager.this,"已複製",Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(FileManager.this,"已貼上",Toast.LENGTH_SHORT).show();
                break;
            case 3:
                Toast.makeText(FileManager.this,"剪下",Toast.LENGTH_SHORT).show();
                break;
            case 4:
                Toast.makeText(FileManager.this,"重新命名",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onContextItemSelected(item);
    }

    //獲取dir下所有的檔案
    public List< File> getDate() {

        File file=new File(dir);
        if(file.exists())
        {
            File[] file1=file.listFiles();
            for (File filename :
                    file1) {
                dateList.add(filename);
            }
        }

        return dateList;
    }


    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    public void myPermission() {
        int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 沒有許可權就提示使用者
            ActivityCompat.requestPermissions(
                    this,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }
}

相關推薦

Android提示使用者獲取相應手機許可權

一,簡介Android 6.0 為了保護使用者隱私,將一些許可權的申請放在了應用執行的時候去申請, 比如以往的開發中,開發人員只需要將需要的許可權在清單檔案中配置即可,安裝後用戶可以在設定中的應用資訊中看到:XX應用以獲取****許可權。使用者點選可以選擇給應用相應的許可權。

Android 7.0 獲取自定義許可權

private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, // Manifest.permission.ACCESS_COARSE_

關於Mac升級Android Studio無法獲取安裝目錄許可權的解決辦法

Android Studio3.0 Canary1升級版本2時,報錯Studio does not have write access to /private/var/folders/解決辦法: Terminal中輸入 sudo /Applications/Android\

Android開發之獲取SIM卡資訊和手機號碼

獲取SIM卡資訊和手機號碼的工具類,記錄一下方便以後使用 import android.content.Context; import android.telephony.TelephonyManager; /** * Created by WangJinyong on 20

android 9.0 獲取Uri許可權並且轉換成path輸出

原文地址: Write  by  cdsn @包羅萬碼 At 2018/10/26 需要許可權:  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 一個工具

Android開發之獲取手機硬體狀態資訊(CPU資訊/頻率/使用率、DDR頻率/使用率、電池瞬時電流/電壓/庫倫counter)

有時候我們想要知道當前手機的一些狀態資訊,可以使用app(root 或者系統簽名 )來顯示獲取。 OK,接下來看一下一些關鍵的程式碼。 我這裡使用的是高通的手機,不同硬體平臺的機型,其獲取資訊的節點可能不一樣。 /** * 獲取當前瞬時電流

Android 6.0獲取IMEI號是出錯,動態獲取許可權

    之前更新了一個版本,獲取使用者的IMEI裝置號,本地手機測試沒問題,就放到伺服器上,結果有很多使用者反應,應用打不開。也不是全部使用者,只有少部分Android 6.0系統的使用者和一些root過的使用者,由於那不到使用者手機,只能從錯誤日誌中檢視。 出錯日誌:

Android深入學習之各種隱私許可權判斷和獲取方法總結

Android深入學習之各種隱私許可權判斷和獲取方法總結   從Android SDK 23 開始, Android就改變了許可權的管理模式。對於一些涉及使用者隱私的許可權則需要使用者的授權才可以使用。在此之前,開發者只需要在AndroidManifest.xml中註冊,如網路許可權、w

android 7.0分享朋友圈提示:“獲取資源失敗,僅支援分享照片至朋友圈”或者FileProvider生成的Uri無法識別

需求是把網路圖片地址是string型別,生成圖片,分享到朋友圈,遇到的問題是,7.0之前沒有問題分享朋友圈,順便切上程式碼: Intent intent = new Intent(); Uri uri = null; try { Stri

android 提示“無法返回該圖片”有些機型比如:sony 手機resultCode = 0或者照相、相簿裁剪時候onActivityResult的Intent返回null

這個弄了一下的時間糊里糊塗解決的。 問題就是不管怎麼呼叫相簿還是相機都是返回 “無法返回該圖片”,debug到startActivityForResult都有資料,但在onActivityResult接收資料的時候resultCode = 0了,,本該返回-1怎麼就變成0了,,一直想不明白,

android手機許可權動態申請的那些坑(附帶kotlin的動態申請程式碼)

首先注意一點:在清單檔案內沒有進行申明的許可權進行動態申請時,並不會彈窗 確保需要申請的許可權已經在清單檔案中申明以後,就可以根據相應的功能進行申請: 該部落格只涉及使用Google提供的官方庫進行處理 首先在app的構建檔案中匯入 implementa

Android基礎:獲取手機聯絡人工具類

Bean: public class ContactInfo { public String id; public String name; public String phone; } Co

Android API23(6.0)以上手機必須手動檢測讀取許可權

樓主的手機是華為P9搭載android6.0,今天一個專案需要讀寫檔案,明明檔案目錄下存放資料,讀檔案時一直報FileNotFoundException(沒找到檔案),寫檔案時一直報沒有許可權,然而我都加了。 查了一早上的資料,終於發現API 23(6.0)以

android 6.0及以上動態許可權獲取

基於安全效能的考慮,android 6.0(API 23)以後,google規定了系統需要動態獲取許可權 一、總結需要使用者手動獲取的許可權: 所屬許可權組 許可權 日曆 READ_CALENDAR 日曆 WRITE_CALENDAR 相機

紅米手機5獲取Root超級許可權的步驟

紅米手機5能如何獲得root超級許可權?各位知道,Android系統有root超級許可權,如果手機獲得root相關許可權,就能夠實現更強大的功能,打比方各位企業的營銷部門,使用較多營銷軟體都需要在root超級許可權下執行,如果手機沒辦法獲的root的許可權,則沒辦法正常使用相關的功能。 紅米手機5開發版

Android從本地獲取照片以及呼叫手機拍照功能的方法

本文主要介紹的是從手機中獲取照片並且壓縮後顯示在imageview或者呼叫手機相機拍照之後壓縮顯示在imageView中,具有很好的參考意義,同時兼顧了Android7.0對於呼叫手機相機的設定問題。有需要的可以借鑑一下: 1.XML佈局檔案程式碼 <?xml ve

android 如何去獲取手機Gps的訊號強度

1,看到別人寫的app裡面有展示Gps訊號強度的功能,我們的app也需要這個功能,我是先百度了一圈(沒有發現要找到的內同,百度果然有些東西搜尋不到),還是翻牆去的谷歌看到了,你也可以先去應用市場裡面下載幾個Gps相關的軟體,比如:Gps工具箱, GpsStatus.List

Android 4.2獲取root許可權後以後使用shell命令來開啟飛航模式

1.首先通過su命令獲取root許可權的shell終端。 Process process = Runtime.getRuntime().exec("su"); 2.然後獲得輸出流 bw = new

Android之如何獲取手機程式列表以及程式相關資訊並啟動指定程式

效果圖: 程式列表: 啟動程式,獲取程式資訊: 程式碼如下: 建立一個AppInfo類來表示應用程式 <pre name="code" class="java">public class AppInfo { public

Android adb方式獲取手機總記憶體和可用記憶體資訊

原始碼下載: https://download.csdn.net/download/qq_31939617/10406578 下載 這篇文章主要介紹了Android系統檢測程式記憶體佔用各種方法,並對記憶體資訊的詳細介紹 通過讀取檔案”/proc/mem