
Android开发中,常常需要获取本地或者网络多媒体的一些基本信息。MediaMetadataRetriever类位于androidmedia包下,提供了用于从输入媒体文件检索帧和元数据的统一接口,可以很方便实现这些功能。
本例中提供了获取本地视频和网络视频第一帧的功能,首先初始化MediaMetadataRetriever,如果是本地视频设置数据源时通过 UrifromFile()转化为Uri对象,再通过MediaMetadataRetriever的getFrameAtTime()方法默认获取第一帧。如果是网络视频直接将url设置为数据源即可。
你获取的uri没有问题。但assets目录下的不能使用这种方法读取。你得把它先复制到sdcard中,然后从sdcard中传递这个至于原因嘛:assets目录里面的资源文件还在应用程序的apk文件中,一个压缩文件中。所以不能这样读
Android调用系统拍照的代码:
创建Intent Intent openCameraIntent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);
String imagePath = EnvironmentgetExternalStorageDirectory() + "/image" ;
设置文件路径 File file = new File(imagePath);
if(!fileexists()){
filemkdirs(); }
设置URI,指定相册拍照后保存的路径,Uri imageUri = UrifromFile(new File(imagePath, "imagejsp"));
openCameraIntentputExtra(MediaStoreEXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, REQUEST_CODE_TAKING_PICTURES);
拍照完以后,文件就会保存在这个指定的目录下了。Uri 里指定了相机拍照的路径。
public String getFileType(String fileUri){
File file = new File(fileUri);
String fineName = filegetName();
String fileType = fileNamesubstring(fileNamelastIndexOf(\"\")+1,fileNamelength())
return fileType;
}
从谷歌官方文档的描述来看, 在 Android N版本 以上,直接将file://形式的Uri暴露给了APP应用,会抛出 FileUriExposedException 异常。
Android N以下版本,仍然可以使用 file:// 形式的Uri,但强烈不推荐。
不推荐使用 file:// 的原因在于:
Android N以上版本,将使用 content:// 代替 file:// 形式的Uri,系统将赋予APP临时的权限去获取目标Uri的资源。
FileProvider 是ContentProvider的一个子类。使用 FileProvider可以创建 content:// 形式的Uri,保证APP对文件资源的安全共享。
要使用FileProvider解决Android N以上版本androidosFileUriExposedException的问题,首先要在AndroidManifestxml注册该FileProvider:
然后在res文件夹里添加创建xml/file_pathsxml文件:
创建 content:// Uri,通过FileProvidergetUriForFile(Context context, String authorities, File file)实现。为了实现兼容,可通过根据设备系统使用不同的方法获取Uri:
这样就同时兼容 file:// 和 content:// 的Uri形式,下面的例子是调用系统相机拍照时,通过FileUtils获取照片保存路径的Uri:
参考博客:
在安卓中打开音乐、视频、、文档等文件是需要有读取SD卡权限的,如果是60以下的系统,则直接在清单文件中声明SD卡读取权限即可;如果是60或以上,则需要动态申请权限。
在70以下中打开文件时,通过intent调用系统安装得人软件打开文件就好了,但是在android70及以上的机子上这么做会报androidosFileUriExposedException错误,
1)读取SD卡
2)动态申请权限
//设备API大于60时,主动申请权限(读取文件的权限)
public static void requestPermission(Activity context) {
if (BuildVERSIONSDK_INT >= BuildVERSION_CODESM) {
if (ContextCompatcheckSelfPermission(context, ManifestpermissionWRITE_EXTERNAL_STORAGE)
!= PackageManagerPERMISSION_GRANTED) {
ActivityCompatrequestPermissions(context, new String[]{ManifestpermissionWRITE_EXTERNAL_STORAGE,
ManifestpermissionREAD_EXTERNAL_STORAGE}, 0);
}
}
}
3)读取文件
intent = OpenFileUtilopenFile(filePath+"/"+FileName+""+end);
使用OpenFileUtil这个。链接: >
ContentResolver resolver = getContentResolver();
Cursor cursor = resolverquery(originalUri, proj, null, null, null);
// 按我个人理解 这个是获得用户选择的的索引值
int column_index = cursorgetColumnIndexOrThrow(MediaStoreImagesMediaDATA);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursormoveToFirst();
// 最后根据索引值获取路径
String path = cursorgetString(column_index);
这样就获得了的路径。
下面说上传,现在一般上传都用Ok>
以上就是关于Android多媒体信息获取全部的内容,包括:Android多媒体信息获取、如何获得assets目录下文件的uri、一个关于android的问题,我通过下面的方法调用相机,可是怎么可以在拍照结束后获取照片的路径呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)