Android选择图片或视频进行循环播放
时间:2019-04-07
本文章向大家介绍Android选择图片或视频进行循环播放,主要包括Android选择图片或视频进行循环播放使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
项目要求对本地图片或者视频进行轮播,功能实现完成后发现只是在模拟器上运行ok,后来发现是文件路径的原因。
文件uri的头部有两种一种是以file开头一种是以content开头要进行判断转化
实现如下:
视频 点击吊起文件查看:
private void setVideoPath() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。 intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, VIDEO_PATH); }
在返回中取得选中文件路径
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case VIDEO_PATH: Uri uri = data.getData(); String path = getPath( uri); showToastReal("你选中的视频路径:" + path); SpUtils.getInstace(this).saveString("videoPath", path); break; case PIC_PATH: Uri picUri = data.getData(); String picPath = getPath(picUri); showToastReal("你选中的图片路径:" + picPath); SpUtils.getInstace(this).saveString("picPath", picPath); break; } }
public String getPath(Uri uri) { String path; if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开 path = uri.getPath(); return path; } if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后 path = getPath(this, uri); } else {//4.4以下下系统调用方法 path = getRealPathFromURI(uri); } return path; } @SuppressLint("NewApi") public String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); }
实现视频轮播
public class VideoActivity extends BaseActivity { @Bind(R.id.sv_ad) SurfaceView vv; @Bind(R.id.id_ig_back) ImageView idIgBack; private MediaPlayer mPlayer; private String path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_video); ButterKnife.bind(this); verifyStoragePermissions(this); init(); // init2(); } private void init2() { String path = SpUtils.getInstace(VideoActivity.this).getString("videoPath"); Uri uri = Uri.parse("file://" + path); try { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), uri); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } private void init() { idIgBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); vv.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; } } @Override public void surfaceCreated(SurfaceHolder holder) { path = SpUtils.getInstace(VideoActivity.this).getString("videoPath"); try { if (mPlayer == null) { mPlayer = MediaPlayer.create(VideoActivity.this, Uri.parse("file://" + path)); } if(mPlayer==null){ showToastReal("请在个人中心中选择正确的视频"); } mPlayer.setDisplay(holder);//将SurfaceHolder关联mediaplayer mPlayer.setLooping(true); mPlayer.start(); mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub return false; } }); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } public void onBack(View view) { finish(); } @Override public void loadNetData() { } private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * 检查应用程序是否允许写入存储设备 * <p> * <p> * <p> * 如果应用程序不允许那么会提示用户授予权限 * * @param activity */ public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions( activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE ); } } }
layout的实现
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/sv_ad" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageView android:id="@+id/id_ig_back" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="16dp" android:padding="16dip" android:src="@drawable/icon_back_white" /> </RelativeLayout>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 深入理解C# 3.x的新特性(1): Anonymous Type
- Linux基础(day65)
- 18.12 keepalived + LVS
- 学会JS只是知道了“是什么”,并不意味着你会用JS做什么
- Linux基础(day68)
- 启动zabbix 报错
- 深入理解C# 3.x的新特性(2):Extension Method[上篇]
- 深入理解C# 3.x的新特性(2):Extension Method[下篇]
- 19.13/19.14 配置邮件告警
- 19.12 添加自定义监控项目
- [原创]深入理解C# 3.x的新特性(3):从Delegate、Anonymous Method到Lambda Expression
- a=b=c,但a不等于c?这是什么鬼
- 为什么不是0,1,2,3,4?setTimeout的奇怪问题
- Linux基础(day67)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 恕我直言你可能真的不会java第8篇-函数式接口
- 突破 DockerHub 限制,全镜像加速服务
- 恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合
- K8S 生态周报| KIND v0.9 发布带来众多更新
- oracle 数据回滚,恢复误删的数据,闪回表功能的使用
- C语言 | 关于结构体内存对齐,看这篇就够了
- Python 图像处理篇-利用opencv库展示本地图片实例演示
- Python 图像处理篇-利用opencv库和numpy库读取包含中文路径下的本地图片实例演示
- 从头创建您自己的vue.js——第2部分(虚拟DOM基础)
- Manage Jenkins报错:"依赖错误: 部分插件由于缺少依赖无法加载...",解决办法
- 从头创建您自己的vuei .js——第3部分(构建VDOM)
- adb 模拟上下左右滑动,示例演示
- python 技术篇-pythoncom.PumpMessag()关闭、杀死它的进程,pythoncom.PumpMessag()运行卡住解决办法
- PyQt5 技术篇-QWidget、QDialog程序窗口关闭closeEvent()触发事件方法重写
- 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云