2016-11-18 22 views
0

我試過使用一個簡單的活動來選擇多個視頻,但我得到的文件路徑始終爲空。即使我得到的URI,如:Android - Picker來選擇多個視頻

「內容://com.android.providers.media.documents/document/video%3A86935」

我不能轉換成文件路徑此。使用下面的代碼,「videoPath爲空」將始終打印。

public class VideoPickerActivity extends Activity { 

    private static final String TAG = "VideoPickerActivity"; 

    private static final int SELECT_VIDEO = 1; 

    private List<String> selectedVideos; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent intent = new Intent(); 
     intent.setType("video/mp4"); 
     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select videos"), SELECT_VIDEO); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_VIDEO) { 
       selectedVideos = getSelectedVideos(data); 
      } 
     } 
     finish(); 
    } 

    private List<String> getSelectedVideos(Intent data) { 

     List<String> result = new ArrayList<>(); 

     String[] filePathColumn = { MediaStore.Video.Media.DATA }; 

     // Single video selected 
     if(data.getData() != null){ 

      Uri mImageUri = data.getData(); 

      // Get the cursor 
      Cursor cursor = getContentResolver().query(mImageUri, 
        filePathColumn, null, null, null); 
      // Move to first row 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String videoPath = cursor.getString(columnIndex); 
      if(videoPath == null) 
       Log.e(TAG, "videoPath is null"); 
      result.add(videoPath); 
      cursor.close(); 
     } 
     // Multiple videos selected 
     else { 
      ClipData mClipData = data.getClipData(); 
      if (mClipData != null) { 
       for (int i = 0; i < mClipData.getItemCount(); i++) { 

        ClipData.Item item = mClipData.getItemAt(i); 
        Uri uri = item.getUri(); 
        // Get the cursor 
        Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); 
        // Move to first row 
        if (cursor == null) 
         Log.e(TAG, "cursor is null"); 
        else { 
         if (cursor.moveToFirst()) { 
          int columnIndex = cursor.getColumnIndex(MediaStore.Video.Media.DATA); 
          String videoPath = cursor.getString(columnIndex); 
          if(videoPath == null) 
           Log.e(TAG, "videoPath is null"); 
          result.add(videoPath); 
         } else { 
          Log.e(TAG, "cannot use cursor"); 
         } 
         cursor.close(); 
        } 
       } 
      } 
     } 

     return result; 
    } 
} 

任何幫助將不勝感激,謝謝!

回答

0

所以,我做它的基礎上this answer

這裏管理是我使用的代碼:

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.ClipData; 
import android.content.ContentUris; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.DocumentsContract; 
import android.provider.MediaStore; 
import java.util.ArrayList; 
import java.util.List; 

public class VideoPickerActivity extends Activity { 

    private static final String TAG = "VideoPickerActivity"; 

    private static final int SELECT_VIDEOS = 1; 
    private static final int SELECT_VIDEOS_KITKAT = 1; 

    private List<String> selectedVideos; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (Build.VERSION.SDK_INT <19){ 
      Intent intent = new Intent(); 
      intent.setType("video/mp4"); 
      intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(Intent.createChooser(intent, "Select videos"),SELECT_VIDEOS); 
     } else { 
      Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
      intent.addCategory(Intent.CATEGORY_OPENABLE); 
      intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 
      intent.setType("video/mp4"); 
      startActivityForResult(intent, SELECT_VIDEOS_KITKAT); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      selectedVideos = getSelectedVideos(requestCode, data); 
     } 
     finish(); 
    } 

    private List<String> getSelectedVideos(int requestCode, Intent data) { 

     List<String> result = new ArrayList<>(); 

     ClipData clipData = data.getClipData(); 
     if(clipData != null) { 
      for(int i=0;i<clipData.getItemCount();i++) { 
       ClipData.Item videoItem = clipData.getItemAt(i); 
       Uri videoURI = videoItem.getUri(); 
       String filePath = getPath(this, videoURI); 
       result.add(filePath); 
      } 
     } 
     else { 
      Uri videoURI = data.getData(); 
      String filePath = getPath(this, videoURI); 
      result.add(filePath); 
     } 

     return result; 
    } 

    /** 
    * Get a file path from a Uri. This will get the the path for Storage Access 
    * Framework Documents, as well as the _data field for the MediaStore and 
    * other file-based ContentProviders. 
    * 
    * @param context The context. 
    * @param uri The Uri to query. 
    * @author paulburke 
    */ 
    @SuppressLint("NewApi") 
    public static 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]; 
       } 

       // TODO handle non-primary volumes 
      } 
      // 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 the remote address 
      if (isGooglePhotosUri(uri)) 
       return uri.getLastPathSegment(); 

      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 static 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 index = cursor.getColumnIndexOrThrow(column); 
       return cursor.getString(index); 
      } 
     } finally { 
      if (cursor != null) 
       cursor.close(); 
     } 
     return null; 
    } 


    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is ExternalStorageProvider. 
    */ 
    public static 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 static 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 static boolean isMediaDocument(Uri uri) { 
     return "com.android.providers.media.documents".equals(uri.getAuthority()); 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is Google Photos. 
    */ 
    public static boolean isGooglePhotosUri(Uri uri) { 
     return "com.google.android.apps.photos.content".equals(uri.getAuthority()); 
    } 
}