標籤: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擷取許可權