2015-06-25 14 views
6

mogę otworzyć galerię z tego kodu,Jak wybrać film z galerii i uzyskać jego prawdziwą ścieżkę?

Intent intent = new Intent(Intent.ACTION_PICK); 
    intent.setType("video/*"); 

    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select Video"), PICK_VIDEO_REQUEST); 

Działa dobrze na Samsung Galaxy S5. Jednak w niektórych telefonach wyświetlane są obrazy wraz z filmami.

Jakie zmiany należy wprowadzić, aby otworzyć galerię, aby wyświetlić tylko filmy wideo tylko?

Jak uzyskać rzeczywistą ścieżkę wybranego wideo po zwróceniu wyników?

Odpowiedz

22

Oto pełny kod aby uzyskać ścieżkę wideo po wybraniu z galerii.

Intent intent = new Intent(); 
intent.setType("video/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent,"Select Video"),REQUEST_TAKE_GALLERY_VIDEO); 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == REQUEST_TAKE_GALLERY_VIDEO) { 
       Uri selectedImageUri = data.getData(); 

       // OI FILE Manager 
       filemanagerstring = selectedImageUri.getPath(); 

       // MEDIA GALLERY 
       selectedImagePath = getPath(selectedImageUri); 
       if (selectedImagePath != null) { 

        Intent intent = new Intent(HomeActivity.this, 
          VideoplayAvtivity.class); 
        intent.putExtra("path", selectedImagePath); 
        startActivity(intent); 
       } 
      } 
     } 
    } 

    // UPDATED! 
    public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Video.Media.DATA }; 
     Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
     if (cursor != null) { 
      // HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL 
      // THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA 
      int column_index = cursor 
        .getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 
     } else 
      return null; 
    } 
+1

Ścieżka get zwraca NULL czy działa w przypadku wideo? – HAXM

+0

managedQuery to funkcja zdefiniowana przez użytkownika? proszę dodaj to także –

+1

@JPn to nie jest funkcja zdefiniowana przez użytkownika. Metoda została uznana za przestarzałą na poziomie interfejsu API 11, zamiast tego użyj CursorLoader. zobacz ten link [link] (https://developer.android.com/reference/android/app/Activity.html#managedQuery) – Prashant

-1

Zastosowanie

Intent intent = new Intent(); 
     intent.setType("video/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent,"Select Video"),REQUEST_TAKE_GALLERY_VIDEO); 
6
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI); 

startActivityForResult(intent , SELECT_VIDEO); 
+0

To pozwala ci wybrać tylko jeden film. – b005t3r

-1
Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Video.Media.EXTERNAL_CONTENT_URI); 
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); 
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

startActivityForResult(intent, 
          CAMERA_CAPTURE_VIDEO_REQUEST_CODE); 


@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
Uri selectedImageUri = data.getData(); 
imagePath = getPath(selectedImageUri); 
public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Video.Media.DATA }; 
     Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
     if (cursor != null) { 

      int column_index = cursor 
        .getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 
     } else 
      return null; 
    } 
} 
+0

Metoda wewnątrz metody nie jest możliwa –

0

Dostaniesz prawdziwą ścieżkę od tej metody getPath

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 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 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 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()); 
} 

public static MultipartBody.Part getMultiPartBody(String key, String mMediaUrl) { 
    if (mMediaUrl != null) { 
     File file = new File(mMediaUrl); 
     RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); 
     return MultipartBody.Part.createFormData(key, file.getName(), requestFile); 
    } else { 
     return MultipartBody.Part.createFormData(key, ""); 
    } 
} 

}

0

Poniżej kod działa dla mnie:

Intent videoPickIntent = new Intent(Intent.ACTION_PICK); 
videoPickIntent.setType("video/*"); 
TheActivity.startActivityForResult(Intent.createChooser(videoPickIntent, "Please pick a video"), PickIntroductionVideo); 

i w onActivityResult:

if (requestCode != PickIntroductionVideo) 
    return; 
if (resultCode != Activity.RESULT_OK) 
    return true; 
String pickedVideoUrl = FarayanUtility.getRealPathFromUri(getContext(), data.getData()); 

Metoda FarayanUtility.getRealPathFromUri jest:

public static String getRealPathFromUri(Context context, Uri contentUri) { 
    Cursor cursor = null; 
    try { 
     String[] proj = {MediaStore.Images.Media.DATA}; 
     cursor = context.getContentResolver().query(contentUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
} 
Powiązane problemy