今天完成两件事:1、android 6.0运行时权限检测。2、从网络上获取气象数据并转换为weatherData。下面分别对这两件事对应的知识点进行整理。
一、运行时权限检测。
android 6.0开始,默认情况下应用没有任何权限去执行对其它应用、操作系统、用户有不利影响的操作,这涉及到android 6.0的安全体系结构(Security Architecture),也是android安全体系的核心。android 6.0中,权限分为普通权限和运行时权限。
1、普通权限。只需在manidest中申明,系统会自动授予这些权限。
2、运行时权限。同样需要先在manifest中申明,但用户可以明确选择允许或者拒绝这些申请。
经过今天的实验,android 6.0的运行时权限检测不会影响在6.0以下的系统中的运行。
运行时权限检测的方法:
1、在Manifest中申明权限。
2、在需要用到相应权限的地方申请权限
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED){//判断是否被授予这项权限
//如果没有,则申请
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},FINE_LOCATION_REQUEST_CODE);
}else {
//如果有,执行相应操作。locate current city and get it's weather
getLocalCityWeather();
}
3、判断用户是否同意权限申请
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==FINE_LOCATION_REQUEST_CODE && grantResults[0]==PackageManager.PERMISSION_GRANTED){
getLocalCityWeather();
}else {
startCityListActivity();
}
}
二、从网络上获取气象数据并填充到weatherData中。
涉及两个知识点:
(一)从网络获取数据:android http请求方式之一HttpURLConnection,除了这种,还有一种HttpClient,已经被谷歌弃用。在android 4.4版本中HttpURLConnection已经被替换成了OkHttp。一般实际开发并不会用HttpURLConnection和HttpClient,使用第三方网络请求框架,诸如:Volley,android-asny-http,loopj等 ,因为网络操作涉及到异步以及多线程,自己动手写很麻烦,简单的网络数据获取还是要以用HttpURLConnection的。
1、HttpURLConnection介绍:一种多用途,轻量级的HTTP客户端,使用它来进行HTTP操作适用于大多数程序 。继承自URLConnection类,抽象类,无法直接实例化对象。通过调用openConnection()方法获得对象实例,默认是带gzip压缩的。
2、HttpURLConnection的使用步骤
创建一个URL对象:URL url = new URL(http://www.baidu.com);
调用URL对象的openCollection():HttpURLConnection connection = url.openConnection();
设置http请求方法get或者post:connection.setRequestMethod("GET");
设置连接超时以及服务器希望得到的一些信息:connection.setConnectionTimeout(6*1000);connection.setReadTimeout(6*1000);
调用getInputStream()方法获得服务器返回的输入流:InputStream in = connection.getInputStream();
关闭连接:connection.disconnect();
(二)JSON数据解析:主要用到两个类,JSONObject和JSONArray。这里这要掌握了JSON数据的格式就可以很方便的用这两个类来解析JSON数据。不过实际开发中也用诸如Gson,Fastjson,jackson等第三方库。JSON数据格式很简单,名称:值 或者 名称:{值对}(和结构体的格式很像),名称:[数组值/值对]。
相关参考文档:
http://blog.csdn.net/fancylovejava/article/details/26102635
http://www.runoob.com/w3cnote/android-tutorial-json.html
http://www.runoob.com/w3cnote/android-tutorial-httpurlconnection.html