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

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

02-06 13:16
查看更多