【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!
-------------------------------------------
基于MVVM框架的高德天气APP:
功能点实现说明:
- 应用权限申请:sdk23后,需动态申请应用权限,实现封装权限动态申请机制;
一、 技术背景:
SDK23后,应用需要动态申请相关权限。
二、代码实现(以外置存储权限为例):
1. AndroidManifest.xml 权限申明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. 权限代码实现 WtPermissionActivity.java:
/**
* Created by GaryCao on 2019/01/13.
* 动态申请权限
*/
public class WtPermissionActivity extends AppCompatActivity {
public static int REQUEST_CODE_PERMISSION = 0x10001;
/**
* 需动态申请的权限列表
*/
private static String[] mAllPermissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//发起权限申请
List<String> needPermissions = getNeedGrantPermissions(mAllPermissions);
ActivityCompat.requestPermissions(
this,
needPermissions.toArray(new String[needPermissions.size()]),
REQUEST_CODE_PERMISSION);
}
/**
* 获取待用户授权的权限列表
*
* @param permissions
* @return
*/
private List<String> getNeedGrantPermissions(String[] permissions) {
List<String> needRequestPermissionList = new ArrayList<>();
for (String permission : permissions) {
if (PermissionChecker.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
needRequestPermissionList.add(permission);
}
}
return needRequestPermissionList;
}
/**
* 系统API: 系统请求权限结束时自动回调
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_PERMISSION) {
if (checkPermissionsGrantResult(grantResults)) {
LogUtils.d("onRequestPermissionsResult success");
}
finish();
}
}
/**
* 检测用户是否授权所有权限
*
* @param grantResults
* @return
*/
private boolean checkPermissionsGrantResult(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 唯一入口:请求权限
*
* @return true:启动授权界面 false:已授权,直接return走正常流程
*/
public static boolean startRequestAllPermission(Context context) {
if (!checkPermissionsGranted(context, mAllPermissions)) {
Intent intent = new Intent();
intent.setAction("android.wt.action.PERMISSION_REQUEST");
context.startActivity(intent);
return true;
}
return false;
}
/**
* 查询应用是否有未授权项
*
* @param permissions
* @return
*/
private static boolean checkPermissionsGranted(Context context, String[] permissions) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
for (String permission : permissions) {
if (PermissionChecker.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
}
3. 权限检测发起:
/**
* 发起权限申请
*/
public void test(Context context) {
WtPermissionActivity.startRequestAllPermission(context);
}
-------------------------------------------
文章目录(未完,待续):
一:android 应用子功能及移动框架总述 https://mp.csdn.net/postedit/86665564
二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655
三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790
四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964
五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321
六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392
七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573
八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664
九:android ThreadPoolExecutor线程池 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667101
十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667375
十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178
十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708
十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354
十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531
十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703
十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849
-------------------------------------------
【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!