​​ <-------个人网站传送门------->​

个人开发环境:Ubuntu18.04+IDEA2019.1+Android9.0

问题起源,开发一个简单Android播放器去播放SD卡上的视频/音频文件。由于需要将文件复制到模拟器的SD卡上,课本上和网上教程是关于用Eclipse和Android Studio进行开发的,借助DDMS可以轻松实现。可是我用的IDEA找不到打开DDMS的地方,网上也没找到啥有用的信息。

这里简单归纳下解决办法:

思路:找到自己安装Android SDK的路径,进入其下的tools文件夹,用终端打开并输入montior 回车(也可直接用终端定位到此目录执行monitor),此时发现DDMS已正常启动,可以进行向SD卡导入文件的操作。(需要提前开启安卓虚拟机AVD)

注意:模拟器SD卡目录为mnt文件夹下的sdcard,选中这里点右上角的导入按钮即可向SD卡导入所需文件。

我发现导入后的文件这里好像并不能在sdcard下面看到,不过只要导入过程中控制台没有错误提醒,即说明导入成功。(也可以在安卓模拟器自带的文件管理应用中进行查看)

IDEA向安卓模拟器SD卡中导入文件_sd卡

文件导入成功,剩下便是在代码中的引用了。

这里谈下关于文件路径的设置及访问权限的获取。

path = "/sdcard/Movies/sample.3gp";

mMediaPlayer.setDataSource(path);// 设置数据源

path值只需要填写为“/sdcard/所在文件夹/所在文件”即可。

运行项目发现还是不行,获取数据源出错。一开始以为是path设置的路径有误,后面发现是忘记加访问权限了。

在AndroidManifest.xml文件的<application>标签之前加入下面两句获取访问权限的代码

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

此时如果运行项目还是会出现如下情况,很明显的错误提醒,没有访问权限。

IDEA向安卓模拟器SD卡中导入文件_访问权限_02

可是前面不是刚加了访问权限嘛,怎么还提示没有。

仔细看书才发现是Android版本的问题,在Android6.0以后的版本加了新的保护权限,需要 动态获取权限。

代码如下:

private void setRegist()        //动态获取权限{
//android 6.0新特性,一些保护权限,
//如,文件读写除了要在AndroidManifest中申明权限,还需要进行动态获取
if(Build.VERSION.SDK_INT>=23){
//大于23指android6.0以后的版本。
int REQUEST_CODE_CONTACT=101;
final int REQUEST_EXTERNAL_STORAGE=1;
String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
//验证是否许可权限
for(String str:PERMISSIONS_STORAGE){
if(this.checkSelfPermission(str)!= PackageManager.PERMISSION_GRANTED) {
this.requestPermissions(PERMISSIONS_STORAGE, REQUEST_CODE_CONTACT);
return;
}
}
}
}

 

上述方法写在MainActivity中即可,在onCreate方法中调用即可。

这样在运行时会弹出如下的权限请求,ALLOW即可。

IDEA向安卓模拟器SD卡中导入文件_访问权限_03

 

机智的解决上述问题,除了动态请求权限。也可以打开模拟器的设置,在里面找到APP相关设置,然后给予该APP访问权限。

IDEA向安卓模拟器SD卡中导入文件_访问权限_04