2014-01-17 5 views
3

В моем приложении я начать Intent, чтобы выбрать видео файл, как этотПолучить путь к файлу с Ури из видео Chooser

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setType("video/*"); 
startActivityForResult(intent, kVideoPickerRequestCode); 

Когда он приходит обратно я получаю Uri, как это:

if(resultCode == RESULT_OK) { 
    if (requestCode == kVideoPickerRequestCode) { 
    Uri selectedVideoURI = data.getData(); 
    } 
} 

Этот Ури, кажется, хорош для моего VideoView. Он отлично воспроизводит выбранное видео. Но теперь я хотел бы загрузить видео на сервер и, следовательно, мне нужен файл.

Независимо от того, как я пытаюсь преобразовать Ури в строку-Path, он не ... Я читал некоторые SO сообщения об этом, как How to convert content:// Uri into actual file path? или FileNotFoundException when trying to upload a recorded video to server from Android app , но это просто не работает для меня.

код, как это всегда возвращает NULL в качестве пути:

public static String getRealPathFromUri(Activity activity, Uri contentUri) { 
    String[] proj = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = getActivity().getContentResolver().query(uri, proj, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

Мой тест-устройство работает под управлением Android 4.4.2. Может быть, это проблема безопасности с KitKat?

Спасибо за подсказку!

ответ

2

Ваш Uri не обязательно представляет собой файл на диске. Он начинается с содержимого: // означает, что он обслуживается поставщиком содержимого для этого типа файла.

Вам действительно не нужен файл в файловой системе (хотя, вы можете). То, что вы хотите сделать, - это передать данные из поставщика контента прямо на сервер.

Есть несколько хороших примеров - я хотел бы попробовать this one для того, как сделать это, в первом разделе «Как получить доступ к двоичных данных существующих контент-провайдеров»

+0

Кажется, что нужно использовать InputStream ... THX !!! – Georg

-2
  • Здравствуйте я знаю, что это слишком поздно, но недавно я нашел решение той же задачи

    Я также сталкиваются с той же проблемой, но вот метод

    общественности статической строки GetPath (окончательный контекст контекст, окончательный Uri Uri) {

    if (DEBUG) 
         Log.d(TAG + " File -", 
           "Authority: " + uri.getAuthority() + 
             ", Fragment: " + uri.getFragment() + 
             ", Port: " + uri.getPort() + 
             ", Query: " + uri.getQuery() + 
             ", Scheme: " + uri.getScheme() + 
             ", Host: " + uri.getHost() + 
             ", Segments: " + uri.getPathSegments().toString() 
           ); 
    
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 
    
        // DocumentProvider 
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 
    
         // ExternalStorageProvider 
         else 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 
         } 
    
         // 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; 
    } 
    

, который я получаю от этого URL

-> Другие методы могут быть выбраны из этого файла UTILS FILE наслаждаться кодирования :) -> и это заставляет меня полный путь видео от Ури надеюсь, это вам поможет :)

Смежные вопросы