首页 > 系统 > Android > 正文

Android选择图片或视频进行循环播放

2019-10-22 18:25:10
字体:
来源:转载
供稿:网友

项目要求对本地图片或者视频进行轮播,功能实现完成后发现只是在模拟器上运行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> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表