Android#05--App運(yùn)行時(shí)彈出權(quán)限請(qǐng)求

2017-3-24

對(duì)于有的手機(jī)在第一次安裝 app 時(shí),會(huì)自動(dòng)彈出權(quán)限請(qǐng)求嵌溢;但有的卻不會(huì)弥虐,例如 android 6.0 系統(tǒng)漓踢。

[1] 需求--做一個(gè)例如下圖的權(quán)限請(qǐng)求

自定義的包涵多個(gè)權(quán)限請(qǐng)求

一般一個(gè) app 有多種權(quán)限請(qǐng)求,基本的包括WRITE_EXTERNAL_STORAGE疚颊、WRITE_CONTACTS狈孔、READ_PHONE_STATE等。下面以請(qǐng)求CAMERA材义、WRITE_EXTERNAL_STORAGE均抽、WRITE_CONTACTS為例。

單獨(dú)的權(quán)限請(qǐng)求

[2] 實(shí)現(xiàn)過程

[2.1] 在 Manifest 文件中添加你需要申請(qǐng)的權(quán)限

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

[2.2] 在 Activity 中

final private int MY_PERMISSIONS_REQUEST_READ_CONTACTS=124;
    private static final String TAGLOG = "Contacts";
    private void insertDummyContact() {
        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(2);
        ContentProviderOperation.Builder op =
                ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null);
        operations.add(op.build());
        op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                        "__DUMMY CONTACT from runtime permissions sample");
        operations.add(op.build());

      
        ContentResolver resolver = getContentResolver();
        try {
            resolver.applyBatch(ContactsContract.AUTHORITY, operations);
        } catch (RemoteException e) {
          
        } catch (OperationApplicationException e) {
   
        }
    }
 private void insertDummyContactWrapper() {
        List<String> permissionsNeeded = new ArrayList<String>();

        final List<String> permissionsList = new ArrayList<String>();
        if (!addPermission(permissionsList, Manifest.permission.CAMERA))
            permissionsNeeded.add("Camera");
        if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
            permissionsNeeded.add("Storage");
        if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
            permissionsNeeded.add("Write Contacts");

        if (permissionsList.size() > 0) {
            if (permissionsNeeded.size() > 0) {
                String message = "You need to grant access to " + permissionsNeeded.get(0);
                for (int i = 1; i < permissionsNeeded.size(); i++)
                    message = message + ", " + permissionsNeeded.get(i);
                showMessageOKCancel(message,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(StartActivity.this,permissionsList.toArray(new String[permissionsList.size()]),
                                        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                            }
                        });
                return;
            }
            ActivityCompat.requestPermissions(StartActivity.this,permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            return;
        }

        insertDummyContact();
    }
private boolean addPermission(List<String> permissionsList, String permission) {
        int hasWriteContactsPermission = ContextCompat.checkSelfPermission(StartActivity.this,
                Manifest.permission.CAMERA);
        if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
       
            if (!ActivityCompat.shouldShowRequestPermissionRationale(StartActivity.this,permission))
                return false;
        }
        return true;
    }

private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(StartActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }
 @Overrid
 public void onRequestPermissionsResult(int requestCode,String permissions[],int[]grantResults){
        switch(requestCode){
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
            {

                Map<String, Integer> perms = new HashMap<String, Integer>();
         
                perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);
            
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);
             
                if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
                    insertDummyContact();
                } else {
                    Toast.makeText(StartActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
                            .show();
                }
            }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

[2.3]記得在 onCreate() 方法下調(diào)用哦

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start)其掂;
       insertDummyContactWrapper();
        L.d(TAG,"請(qǐng)求權(quán)限");
    }

[3] 分享

最近看了一本書--《柴靜的氣場(chǎng)法則》油挥,沒有看《看見》時(shí)的那種心跳的感覺,但卻有平淡中的強(qiáng)大力量款熬。喜歡書中的這樣一句話

內(nèi)心獨(dú)立深寥,倔強(qiáng)生長

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贤牛,隨后出現(xiàn)的幾起案子惋鹅,更是在濱河造成了極大的恐慌,老刑警劉巖殉簸,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闰集,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡般卑,警方通過查閱死者的電腦和手機(jī)武鲁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝠检,“玉大人洞坑,你說我怎么就攤上這事∮剩” “怎么了迟杂?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長本慕。 經(jīng)常有香客問我排拷,道長,這世上最難降的妖魔是什么锅尘? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任监氢,我火速辦了婚禮,結(jié)果婚禮上藤违,老公的妹妹穿的比我還像新娘浪腐。我一直安慰自己,他們只是感情好顿乒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布议街。 她就那樣靜靜地躺著,像睡著了一般璧榄。 火紅的嫁衣襯著肌膚如雪特漩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天骨杂,我揣著相機(jī)與錄音涂身,去河邊找鬼。 笑死搓蚪,一個(gè)胖子當(dāng)著我的面吹牛蛤售,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妒潭,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼悴能,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了杜耙?” 一聲冷哼從身側(cè)響起搜骡,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佑女,沒想到半個(gè)月后记靡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡团驱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年摸吠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚎花。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸痢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出紊选,到底是詐尸還是另有隱情啼止,我是刑警寧澤道逗,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站献烦,受9級(jí)特大地震影響滓窍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巩那,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一吏夯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧即横,春花似錦噪生、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舔庶,卻和暖如春抛蚁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惕橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工瞧甩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弥鹦。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓肚逸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彬坏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朦促,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容