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> 

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

(0)

相关推荐

  • Android ViewPager循环播放广告实例详解

    Android  实现ViewPager循环播放广告条实例详解 我们经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环的效果.看到那样的效果,相信大家都会想到ViewPager,但是ViewPager并不支持循环翻页,所以要实现循环还得需要自己去动手.最后还有一个问题就是翻页到最后一页如何平滑过渡到首页的问题.这些都源于有人私信问我ViewPager广告条如何平滑过渡的问题,出于这个问题,我想着亲自实现并分享下吧,本篇就是为了解决这些问题而写的. 1.初始化布局

  • Android实现图片循环播放的实例方法

    很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片.下面我们来看一下具体的实现方法.首先,我们需要在XML...    很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片.下面我们来看一下具体的实现方法. 首先,我们需要在XML文件中配置一下将要播放图片的控件(main.xml): 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearL

  • Android编程实现VideoView循环播放功能的方法

    本文实例讲述了Android编程实现VideoView循环播放功能的方法.分享给大家供大家参考,具体如下: package com.hangcheng; import com.example.bdcustomer_demo.R; import com.hangcheng.view.MyVideoView; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import

  • Android ViewPager实现Banner循环播放

    问题的起源 在项目里,有时候需要实现一个图片轮播的效果,用来展示Banner.同时,图片能循环播放,下面还有一排小圆点来指示当前轮播到哪一页了. 如下图: 分析 · 图片的个数是会变化的,同时小圆点的个数也会跟着图片个数变化 · 每一个page的布局是一样的.变化的就是小圆点的个数,所以需要用代码来动态生成小圆点 编码 布局 首先完成 MainActivity 的布局 activity_main.xml <RelativeLayout xmlns:android="http://schem

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

    项目要求对本地图片或者视频进行轮播,功能实现完成后发现只是在模拟器上运行ok,后来发现是文件路径的原因. 文件uri的头部有两种一种是以file开头一种是以content开头要进行判断转化 实现如下: 视频 点击吊起文件查看: private void setVideoPath() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这

  • Android选择图片或拍照图片上传到服务器

    最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI 具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 package com.spring.sky.image.upload; import java.util.HashMap; import java.util.Map; import android.app.Activi

  • 基于OpenCV实现视频循环播放

    目录 介绍 1.Python+OpenCV实现 2.C+++OpenCV实现 补充 介绍 本文将介绍基于OpenCV实现视频的循环播放. 有以下三个步骤: 首先设置一个frame的设置参数frame_counter,值为0 在读帧时间,将每次加一 当 frame_counter 达到视频总帧数时,将当前的帧设置为 0 视频总帧数:CAP_PROP_FRAME_COUNT 设置当前的帧:CAP_PROP_POS_FRAMES VideoCaptureProperties通用属性标识符参考地址. 1

  • Android选择与上传图片之PictureSelector教程

    效果图: [注意]Demo已更新到最新版本,并稍作调整. 之前出过一篇 Android选择与上传图片之ImagePicker教程,这个是okgo作者出的,就一般需求来讲是够了,但是没有压缩,需要自己去搞. 后来业务需求提升,页面要美,体验要好,便不是那么满足需求了,所幸在github上找到PictureSelector(然后当时没多久Matisse就开源了-可以看这里 Android选择与上传图片之Matisse教程),也不用自己再撸一个了,下面来介绍介绍PictureSelector gith

  • Android 使用Vitamio打造自己的万能播放器(7)——在线播放(下载视频)

    前言 本章将实现非常实用的功能--下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术细节实现! 系列 1.Android 使用Vitamio打造自己的万能播放器(1)--准备 2.Android 使用Vitamio打造自己的万能播放器(2)-- 手势控制亮度.音量.缩放 3.Android 使用Vitamio打造自己的万能播放器(3)--本地播放(主界面.视频列表) 4.Andro

  • Android 录制手机屏幕视频生成GIF图片实例详解

    Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当做文件进行对点传输,并不是很方便.想CSDN这样的博客网站也并不支持在博客里放视频这种方式,除非你贴外链,太烦了不是么.最好是如下图这种gif方式,直观 今天来教大家一个易操作的录制方式.当然,一般只适合Android开发者.因为你需要有AndroidStudio 工具 AndroidStudio(完成手机屏幕的视频录制,

  • C# winform循环播放多个视频

    本文实例为大家分享了winform循环播放多个视频的具体代码,供大家参考,具体内容如下 环境: vs2015 +winform 首先,vs自带组件很方便,所以,用windowMediaplayer组件,如果做单曲循环播放的话,加个属性: axWindowsMediaPlayer1.settings.autoStart = true; //设置自动播放 axWindowsMediaPlayer1.settings.setMode("loop", true); //设置循环播放 言归正传:

  • 微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例

    本文介绍了微信小程序的开发,主要包括图片.录音.音频播放.音乐播放.视频.文件,具体如下: 图片: wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 注:文件的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx.saveFile,在小程序下次启动时才能访问得到. 示例代码: wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'],

随机推荐