安卓获取手机视频和图片
Posted open happy鸭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓获取手机视频和图片相关的知识,希望对你有一定的参考价值。
安卓获取手机视频和图片
获取手机本地视频
首先需要获得手机内存权限
在androidManifest.xml中添加代码,获得读取权限
android.permission.READ_EXTERNAL_STORAGE
但是后来我发现android采用了Runtime permission request, 即在运行时请求权限,而不是在编译的时候,即使在manifest.xml里面添加了权限也要在运行时请求
这时可以在运行之后做一下权限判断,如果没有权限则弹出对话框,向用户申请权限,这段代码我写在了刚运行app的第一个activity的oncreate里面,且只需要做一次判断,之后再进入app不需要再开启权限
public static void verifyStoragePermissions(Activity activity)
try
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED)
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
catch (Exception e)
e.printStackTrace();
定义方法chooseVideo,为某个按钮设置监听器,当点击按钮,执行方法chooseVideo,在方法中首先做机型适配:
private void chooseVideo(View view)
flag=0;
if(android.os.Build.BRAND.equals("Huawei"))
Intent intentPic = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
this.startActivityForResult(intentPic,2);
if(android.os.Build.BRAND.equals("Xiaomi"))
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "video/*");
startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), 2);
else
Intent intent = new Intent();
if(Build.VERSION.SDK_INT < 19)
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("video/*");
else
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("video/*");
startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), 2);
再重写方法onActivityResult,里面实现的功能有查询文件路径,并且实现函数回调
public void onActivityResult(int requestCode, int resultCode, Intent data)
Uri uri = data.getData();
// 通过ContentProvider查询文件路径
String[] proj = MediaStore.Images.Media.DATA;
ContentResolver resolver = getContext().getContentResolver();
Cursor cursor = resolver.query(uri, proj, null, null, null, null);
cursor.moveToFirst();
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));//获得文件路径
File file = new File(path);//获得视频
然后获得视频的第一帧作为视频封面呈现在可视化界面上,大概思路是先将图片存储,然后根据图片地址,为页面设置背景图片,就可以达到选择某段视频后,以第一帧作为封面的效果
String videoName = path.split("/")[6].split("\\\\.")[0];//path为视频的路径
MediaMetadataRetriever mmr = new MediaMetadataRetriever();//实例化MediaMetadataRetriever对象
mmr.setDataSource(file.getAbsolutePath());
bitmap = mmr.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);//获得视频第一帧的Bitmap对象
FileOutputStream outStream = null;
try
outStream = new FileOutputStream(new File(this.getContext().getExternalCacheDir().getAbsolutePath() + "/" + videoName + ".jpg"));
bitmap.compress(Bitmap.CompressFormat.JPEG, 10, outStream);
String imagePath = this.getContext().getExternalCacheDir().getAbsolutePath() + "/" + videoName + ".jpg";
File image = new File(imagePath);
Uri imUri = Uri.fromFile(image);
bitmap = BitmapFactory.decodeStream(getContext().getContentResolver().openInputStream(imUri));
imageView.setImageBitmap(bitmap);
outStream.close();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
(上面的代码看上去有点繁琐,有人问为什么不能在获得视频的第一帧的Bitmap对象之后就设置imageView的Bitmap,我试过了但是会设置失败,图片不显示,所以用了一个比较麻烦的方法,如果有更简单的方法麻烦告诉我一下:)
获取手机本地图片
获取手机图片的方法和获取视频的方法大同小异,首先监听器加上一个方法,不要忘记机型适配
private void chooseSurpass()
Log.d("TAG", "chooseSurpass: -----选中");
flag=1;
if(android.os.Build.BRAND.equals("Huawei"))
Intent intentPic = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
this.startActivityForResult(intentPic,2);
if(android.os.Build.BRAND.equals("Xiaomi"))
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(Intent.createChooser(intent, "选择要导入的图片"), 2);
else
Intent intent = new Intent();
if(Build.VERSION.SDK_INT < 19)
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
else
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "选择要导入的图片"), 2);
再重写方法onActivityResult,里面实现的功能有查询文件路径,并且实现函数回调
public void onActivityResult(int requestCode, int resultCode, Intent data)
Uri uri = data.getData();
// 通过ContentProvider查询文件路径
String[] proj = MediaStore.Images.Media.DATA;
ContentResolver resolver = getContext().getContentResolver();
Cursor cursor = resolver.query(uri, proj, null, null, null, null);
cursor.moveToFirst();
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));//获得文件路径
Log.d("TAG", "onActivityResult: -------"+path);
File file = new File(path);//获得图片
//把图片显示在封面上面
surpass.setImageURI(uri);
效果
与安卓交互的上传图片 与 上传语音视频
1、与安卓语音的交互
注意:获取语音的src 需要用DOM元素获取
(1)HTML (点击按钮告诉安卓,录音开始与结束)
<span class="voice" onclick="voicecli()">上传语音</span>
(2)JS
//点击语音 function voicecli() { $(‘.addPicture‘).hide(); $(‘.expaddVoice‘).show(); //调方法 //判断调安卓方法显示或隐藏语音 if($(".voice").text()=="上传语音") { $(".voice").text("取消语音"); window.contact.isVisShow(); //调用安卓方法,告诉安卓录音开始,安卓显示录音按钮 }else if($(".voice").text()=="取消语音"){ $(".voice").text("上传语音"); window.contact.isVisHide(); //调用安卓方法,告诉安卓录音结束,安卓取消录音按钮 } }
//点击关闭图标音频
$(‘.yuyinClose‘).click(function() {
$("#audiovis").attr("src","");
$(".exchVoiceClose").hide();
});
(3)HTML (录音完成后的语音条)
<div class="exchVoiceClose"> <i class="iconfont i-shengyin"></i> //声音图标 <span></span> <audio id="audiovis" src=""></audio> //音频标签 <em class="iconfont icon-guanbi yuyinClose"></em> //语音条关闭按钮 </div>
(4)JS (写一个方法供安卓调用,传语音路径)
//安卓调的语音方法 function dell() { //从安卓获取语音路径 var voices="http://219.140.191.226:8080/agriculture/uploads/"+window.contact.Vis(); // var voices="http://192.168.199.108:8080/agriculture/uploads/"+window.contact.Vis(); //获取页面语音添路径(用DOM元素获取) var audio2 = document.getElementById("audiovis"); audio2.src=voices; //点击语音条时告诉安卓语音播放 $(‘.exchVoiceClose‘).click(function() { window.contact.jsGeiAndroidChuanzhi(voices); }); //语音条显示 if(voices!=null) { $(".exchVoiceClose").show(); } }
(5)详情页语音条的显示
动态创建语音条标签
//语音 if (datas[i].voice != null && datas[i].voice != "") { str += "<div onclick=playvoice(‘" + datas[i].voice + "‘)>" + "<div class=‘exchVoice‘>" + "<i class=‘iconfont i-shengyin‘></i><span class=‘second‘></span>" +
"<audio src=‘"+urllogo+datas[i].voice+"‘></audio>" + //urllogo 是服务器地址
"</div>" +
"</div>"; }
点击播放语音,给安卓传值
//播放语音 function playvoice(url){ window.contact.jsGeiAndroidChuanzhi(urllogo+url); }
2、与安卓视频的交互
1、HTML
//存放video标签的位置
<div class="videoPlay"></div>
2、JS 动态创建video标签(window.open("http://www.baidu.com") 打开一个新窗口)
if(data[0].url != "") { $(‘.videoPlay‘).html(""); var urls = data[0].url.replace("http://",""); urls = "http://" + urls; //视频链接形成外链 var videos = "<video class=‘videoPlaycount‘ controls=‘controls‘ src=‘"+urls+"‘></video>"; $(‘.videoPlay‘).html(videos); }
//点击返回键video标签移除,并且安卓调用此方法 function goivideo() { if($(‘.govideo>video‘).length>0) { $(‘.govideo‘).children(‘video‘).remove(); } }
//返回键处调用
3、与安卓上传图片的交互
(1)HTMl 点击上传图片按钮,和图片存放位置
<!-- 从服务器拿到字符串图片-->
<input type="hidden" name="imgurl" id="imgurl" value=""/>
<div class="addPicture clearfix"> <div class="addPictureImg" id="imgboxid"></div> //图片位置 <div class="addPictureDiv"> <label class="pictureDivCon"> //按钮 <input type=‘file‘ id="imgInp" name="file" class="file" multiple="multiple" /> <!-- onchange="xmTanUploadImg(this)"--> <i class="iconfont icon-tianjiatupian"></i> <p>添加图片</p> </label> </div> </div>
(2)掉安卓方法,从服务器拿取图片
//从服务器拿值 var k=0;//用于记数 (第几张照片) function H5getPicNameFromAndroid() { k++; window.contact.jsGeiAndroidToken("picA"); //调安卓方法,传一下固定值进行判断 var imgurl = window.contact.getPicName(); //从安卓拿到路径 var imgurlstr=imgurl.split(","); //将获取到的图片分隔 var str=""; str=$("#imgurl").val(); //给各个提交页面的input存储img if(str==""){ //如果是第一张图片 $("#imgurl").val(imgurlstr[0]); }else{ $("#imgurl").val(str+","+imgurlstr[0]); } var imgstr="<div class=‘img-div‘><img style=‘width:2.25rem;height:2.25rem‘ src=‘@src‘/><i onclick=clicks(this,"+k+") class=‘iconfont icon-guanbi addPictureClose‘></i></div>"; imgstr=imgstr.replace(‘@src‘, urllogo+imgurlstr[0]); var oimgbox=document.getElementById("imgboxid"); oimgbox.appendChild(ndiv); }
(3)点击删除按钮,删除服务器中的图片
//图片删除按钮 function clicks(me,index){ var str=$("#imgurl").val(); var img=str.split(","); img.splice((index-1),1); img.toString(); $("#imgurl").val(img); $(me).parent().remove(); }
(4)页面中获取图片
var imgurl=$("input[name=imgurl]").val();
以上是关于安卓获取手机视频和图片的主要内容,如果未能解决你的问题,请参考以下文章
Android之如何分析手机系统相册图片和视频删除后保存的位置然后恢复文件,目前已经适配小米OPPOVIVO一加努比亚魅族等手机。