zoukankan      html  css  js  c++  java
  • Android6.0获取运行时权限

    照着《第一行代码》打代码,然并卵,感叹技术进步的神速。最后提醒一点:IT类的书籍一定要注意出版时间!出版时间!出版时间!重要的事情说三遍

    问题出在android6.0的权限获取问题上,以前只要在AndroidManifest.xml一次性获取便可以了,android6.0之后要手动去获得运行时权限才行。或者将AndroidManifest.xml里的targetSdkVersion选为23以下,按6.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     @Override
    20     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     @Override
    28     public void onClick(View v) {
    29         // TODO Auto-generated method stub
    30         //如果没有权限则请求权限,否则直接打电话即可
    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     @Override
    48     /**
    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这种定位,默认用的是谷歌,无法使用。

    想到的可能原因就是这两个了,希望有大神答疑解惑,谢谢啦!!!

  • 相关阅读:
    ES6 对Math对象的扩展
    ES6 对Number的扩展
    monolog 应该是世界上最好的日志插件了
    ES6 解构赋值的常见用途,很强大
    ES6 对象的解构赋值
    ES6 数组的解构赋值
    ES6 const
    laravel相关插件
    c++ 库 boost安装
    Eclipse ftp插件
  • 原文地址:https://www.cnblogs.com/f91og/p/6181325.html
Copyright © 2011-2022 走看看