最近因为 安卓6.0权限 还有 7.0文件共享 事情整的焦头烂额,暴露出一些问题,刚刚开始时并没有出现什么权限和共享文件的bug,后来陆陆续续多了一些高版本用户,导致崩溃率上升了不少,特此需要解决权限问题,之前一直用的是EasyPermission这个框架,刚刚开始也没怎么测试直接丢到项目中跑了,后来深入发现这种方法并非100%不出错,找了几个关于权限的框架,比如一个日本朋友写的PermissionDispatch,国内的没敢用,因为star的数太少了,来回的测试,认为提示不好,国内小米和华为的工程师喜欢搞事,找不出一套兼顾全部机型的方法,最后没辙了,直接上官网,老老实实看英文解释说明,写了一个demo放到优测去测试,结果效果非常好,虽然代码量多了点,那些框架用annotation注解去搞事,对代码各种封装,结果还是没能解决问题,实际上消耗的时间是非常大的,如果一开始做个老实人,应该啥事都没有,之前的文件存储也是一个道理,直接看英文文档,ok,终于弄懂了,对于国内博客各种抄袭表示深深地** 有时候真的怀疑信息的真实性,是不是生活在黑客帝国或者楚门的世界那样的地方。
最近kotlin很热,各种广告,在开发中也觉得安卓的空指针异常处理是非常难受的,明明不会为空的东西在某种情况下就空了,这种bug导致崩溃率又上升了几个点,这一个月的崩溃率2.0左右,离1.5差很多,在说发版本的问题,因为我和测试的疏忽,金额写反导致了俩次发布,实在是汗颜,谁知道这一个月经历了什么。
用时一个半月,也算又熟悉了并习惯了开发的生活,成年后的无限可能性让我着迷。
最后为了字数贴代码 官网才是可靠的干爹
package com.example.robin.permissiontest;
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private final int PERMISSIONS_REQUEST_CON_ST = 1231;
String[] perms = {Manifest.permission.READ_CONTACTS, Manifest.permission.READ_EXTERNAL_STORAGE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
camera();
}
});
}
private void camera() {
if (hasNoPermission(perms)) {
if (shouldShowExplanation(perms)) {
// explain to the user *asynchronously* -- don't block
Log.d("jack", "-----shouldShowExplanation---");
showExplain();
} else {
Log.d("jack", "-----request permission---");
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(MainActivity.this, perms, PERMISSIONS_REQUEST_CON_ST);
}
} else {
Toast.makeText(MainActivity.this, "---u got permission----", Toast.LENGTH_SHORT).show();
Log.d("jack", "-----u got permission do anything here---");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
Log.d("jack", "--------onRequestPermissionsResult---------" + requestCode);
switch (requestCode) {
case PERMISSIONS_REQUEST_CON_ST:
// If request is cancelled, the result arrays are empty.
if (allPermissionGranted(grantResults)) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
Log.d("jack", "-------onRequestPermissionsResult-----finally u got all permission----");
camera();
} else {
if (!shouldShowExplanation(permissions)) { // 完全被拒绝
goSetting();
} else { //
Toast.makeText(MainActivity.this, "---permission denied----", Toast.LENGTH_SHORT).show();
}
}
return;
default:
break;
}
}
private boolean shouldShowExplanation(String[] perms) {
for (int i = 0; i < perms.length; i++) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, perms[i])) {
return true;
}
}
Log.d("jack", "-----shouldShowExplanation return false---");
return false;
}
private boolean hasNoPermission(String[] perms) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Log.d("jack", "-----hasPermission lower api 23---");
return false;
}
for (int i = 0; i < perms.length; i++) {
if (ContextCompat.checkSelfPermission(MainActivity.this, perms[i]) != PackageManager.PERMISSION_GRANTED) {
return true;
}
}
return false;
}
private void showExplain() {
new AlertDialog.Builder(MainActivity.this)
.setTitle("权限说明")
.setMessage("为了功能正常使用,需要以下权限")
.setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton("授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, perms, PERMISSIONS_REQUEST_CON_ST);
dialog.dismiss();
}
}).create().show();
}
private boolean allPermissionGranted(int[] grantResults){
if(grantResults==null || grantResults.length == 0) return false;
for(int i=0; i<grantResults.length; i++){
if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
private void goSetting() {
new AlertDialog.Builder(MainActivity.this)
.setTitle("提示")
.setMessage("没有权限功能无法使用,进入系统设置授权?")
.setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//前往应用详情界面
try {
Uri packUri = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
dialog.dismiss();
} catch (Exception e) {
Toast.makeText(MainActivity.this, "请手动进入系统设置进行授权", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
}).create().show();
}
}
I'm fish, I'm on.