踩了坑,记录一下……
由于现在Android权限的升级,Android6.0以后访问本地文件都是需要动态权限的申请,于是有了工具方法
public class CommonUtils {
public static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE }; //Android6.0以后操作系统的动态权限申请
/**
* 用于Android6.0以后的操作系统,动态申请存储的读写权限
* @param context
*/
public static void requestPermissions(Activity context){
//用于Android6.0以后的操作系统,动态申请存储的读写权限
int permission = ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(context,PERMISSIONS_STORAGE, 1 );
}
}
}
然后呢在需要的Activity中调用即可,如下
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
if (Build.VERSION.SDK_INT >= 23){
CommonUtils.requestPermissions(this);
}
setContentView(R.layout.*);
}
但是呢,问题来了,假如是在首页上调用,并且进入页面就要进行读取本地视频或者图片展示播放时,就有问题了。(主要是第一次进入)要么第一次无法播放,像这种情况:https://segmentfault.com/q/1010000018754023,要么闪退什么的,各种问题。
各种踩坑找到了解决方法:
private MyHndler hndler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hndler = new MyHndler();
initView();
}
private void initMediaPlayer(){
//执行视频播放或者图片加载等
………………
}
private void initView(){
//初始化控件什么的
……&……
//权限判断,如果没有权限就请求权限
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, CommonUtils.PERMISSIONS_STORAGE, 1);
}else{
initMediaPlayer();
}
}else {
initMediaPlayer();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
hndler.sendEmptyMessage(0);
}else{
Toast.makeText(this, "拒绝权限,将无法使用程序。", Toast.LENGTH_LONG).show();
finish();
}
break;
default:
}
}
public class MyHndler extends Handler {
@Override
public void handleMessage(Message msg) {
initMediaPlayer();
}
}
到此就可以完美解决第一次无法正常播放视频或者加载图片的问题了。