Android6.0擷取許可權

來源:互聯網
上載者:User

標籤:app   manager   strong   package   時間   min   generated   自己的   使用者權限   

照著《第一行代碼》打代碼,然並卵,感歎技術進步的神速。最後提醒一點:IT類的書籍一定要注意出版時間!出版時間!出版時間!重要的事情說三遍

問題出在android6.0的許可權擷取問題上,以前只要在Manifest.xml一次性擷取便可以了,android6.0之後要手動去獲得運行時許可權才行。

1. 新增的api

 ContextCompact.checkSelfPermission()--->檢查是否有許可權

 ActivityCompat.requestPermission()--->去申請許可權,ActivityCompat繼承於ContextCompact

 onRequestPermissionResult()-->請求許可權是個非同步過程,所以要在回調裡處理結果,在onRequestPermissionResult()裡拿到使用者是否授權,並做相應的處理。

 ActivityCompat.shouldShowRequsetPermissionRationale()-->向使用者解釋許可權用來做什麼,在使用者拒絕過才會出現

2.使用流程

 

3.例子

 以打電話作為例子,首先在Manifest.xml中註冊許可權

然後在MainActivity.java中按照流程來便可以

 1 package com.example.permissionadmin; 2  3 import android.Manifest; 4 import android.app.Activity; 5 import android.content.Intent; 6 import android.content.pm.PackageManager; 7 import android.net.Uri; 8 import android.os.Bundle; 9 import android.support.v4.app.ActivityCompat;10 import android.support.v4.content.ContextCompat;11 import android.view.View;12 import android.view.View.OnClickListener;13 import android.widget.Button;14 15 public class MainActivity extends Activity implements OnClickListener{16     17     private Button callPhone;18     19     @Override20     protected void onCreate(Bundle savedInstanceState) {21         super.onCreate(savedInstanceState);22         setContentView(R.layout.activity_main);23         callPhone=(Button)findViewById(R.id.call_Phone);24         callPhone.setOnClickListener(this);25     }26 27     @Override28     public void onClick(View v) {29         // TODO Auto-generated method stub30         //如果沒有許可權則請求許可權,否則直接打電話即可31         if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE)!=32                 PackageManager.PERMISSION_GRANTED){33             //第二個參數是數組表明可以一次性擷取多個許可權,後面的請求碼要和回調處理函數的請求碼對上34             ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);35         }else{36             doCallPhone();37         }38     }39     40     public void doCallPhone(){41         Intent intent=new Intent(Intent.ACTION_CALL);42         Uri data=Uri.parse("tel:"+"10086");43         intent.setData(data);44         this.startActivity(intent);45     }46 47     @Override48     /**49      * 不同的請求碼來對應不同的授權請求50      * grantResults數組:許可權請求結果51      */52     public void onRequestPermissionsResult(int requestCode,53             String[] permissions, int[] grantResults) {54         if(requestCode==1){55             if(grantResults[0]==PackageManager.PERMISSION_GRANTED){56                 doCallPhone();57             }else{58                 //提示使用者權限未被授予59             }60         }61     }62 }

4.吐槽

學到《第一行代碼》的第11章基於位置的服務,按照上面打代碼位置始終無法顯示,原來以為是許可權問題,後來發現即使按照這上面的來還是無法顯示自己的經緯度,所以將例子改成了打電話。現在的原因可能是:1.Gps室內無法定位。2.對於Network這種定位,預設用的是Google,無法使用。

想到的可能原因就是這兩個了,希望有大神答疑解惑,謝謝啦!!!

Android6.0擷取許可權

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.