照着《第一行代码》打代码,然并卵,感叹技术进步的神速。最后提醒一点: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中按照流程来便可以

 package com.example.permissionadmin;

 import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button callPhone; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
callPhone=(Button)findViewById(R.id.call_Phone);
callPhone.setOnClickListener(this);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//如果没有权限则请求权限,否则直接打电话即可
if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE)!=
PackageManager.PERMISSION_GRANTED){
//第二个参数是数组表明可以一次性获取多个权限,后面的请求码要和回调处理函数的请求码对上
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
}else{
doCallPhone();
}
} public void doCallPhone(){
Intent intent=new Intent(Intent.ACTION_CALL);
Uri data=Uri.parse("tel:"+"10086");
intent.setData(data);
this.startActivity(intent);
} @Override
/**
* 不同的请求码来对应不同的授权请求
* grantResults数组:权限请求结果
*/
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
if(requestCode==1){
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
doCallPhone();
}else{
//提示用户权限未被授予
}
}
}
}

4.吐槽

学到《第一行代码》的第11章基于位置的服务,按照上面打代码位置始终无法显示,原来以为是权限问题,后来发现即使按照这上面的来还是无法显示自己的经纬度,所以将例子改成了打电话。现在的原因可能是:1.Gps室内无法定位。2.对于Network这种定位,默认用的是谷歌,无法使用。

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

最新文章

  1. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序
  2. 用Python的xlrd模块处理时间单元格
  3. SAP LOGON DATA CHECK
  4. SQL Server代理(5/12):理解SQL代理错误日志
  5. IE下innerText与FoxFire下textContent属性的不同
  6. Daily Scrum – 1/18
  7. 使用ProxychainsMac下安装及配置
  8. leetcode:Search for a Range(数组,二分查找)
  9. 实例源码--Android图片滚动切换效果
  10. python学习第十八天 --错误&异常处理
  11. Median of Sorted Arrays
  12. 02.零成本实现WEB性能测试-基于APACHE JMETER
  13. std::list 源代码解析
  14. CCF-201503-1-图象旋转
  15. 【Jquery系列】之Jquery 选择器
  16. asp.net简述Web Forms开发模式
  17. Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法
  18. Swift的函数与函数指针、闭包Closure等相关内容介绍
  19. spring boot @ConditionalOnxxx相关注解总结
  20. Java 中的语法糖(7/15整个周六上午总结)

热门文章

  1. 《编写可维护的JavaScript》——JavaScript编码规范(一)
  2. 【转】创建SVN仓库的步骤
  3. 在SpringMVC框架下实现文件的 上传和 下载
  4. 完整安装cocoaPods
  5. webstorm vue高亮
  6. R语言解读一元线性回归模型
  7. 如何运用CSS写小三角
  8. UVALive 3635 分派
  9. Java开发中经典的小实例-(冒泡法)
  10. SYSTick 定时器