2016-10-20 5 views
0

Я пытаюсь получить путь к видеофайлу для миниатюры видео. Я не уверен, почему он по-прежнему приходит как null после того, как я модифицировал, основываясь на некоторых решениях здесь. Версия android - 6.0.1.Путь к файлу видео для Android из магазина носителей идет как null

Пользователь нажимает кнопку плавающего действия и вызывает галерею видео.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.addNote); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(); 
      intent.setType("video/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_GALLERY_VIDEO); 
     } 
    }); 

Когда пользователь выбирает желаемое видео из галереи, видео идет к деятельности, которую он будет разобрался.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 

     Uri uri = data.getData(); 
     Log.d(TAG, "Uri: " + uri); 

     Log.d(TAG, "Uri authority: " + uri.getAuthority()); 

     String filemanagerstring = uri.getPath(); 
     Log.d(TAG, "filemanagerstring: " + filemanagerstring); 

     String selectedImagePath = getPath(uri); 
     Log.d(TAG, "selectedImagePath: " + selectedImagePath); 
    } 
} 

Способ получения пути к видеофайлу.

public String getPath(Uri uri) { 

    Cursor cursor = this.getContentResolver().query(uri, null, null, null, null); 
    int idx = 0; 

    //Source not from device capture or selection 
    if (cursor == null) { 
     return uri.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA); 
     if (idx == -1) { 
      Log.d(TAG, "uri path: " + path); 
      return uri.getPath(); 
     } 
    } 
    String path = cursor.getString(idx); 
    Log.d(TAG, "path: " + path); 
    cursor.close(); 
    return path; 
} 

Результаты: Я получил нуль (-1) и получил путь uri, это не правильный путь. Мне нужен полный путь к видеофайлу.

Uri: content://com.android.providers.media.documents/document/video%3A6174 
Uri authority: com.android.providers.media.documents 
filemanagerstring: /document/video:6174 
**uri path: 16842794** 
selectedImagePath: /document/video:6174 
+0

«Мне нужно полный путь видеофайла "- нет, вам нужна миниатюра для видео. Там не обязательно должен быть «полный путь», потому что не обязательно должен быть файл, не говоря уже о том, что вы можете получить доступ к файловой системе. Откуда этот «Ури»? – CommonsWare

+0

Ури исходит из Uri uri = data.getData(); в onActivityResult. Пользователь выберет видео из галереи (если это то, что вы хотите знать). Благодарим за быстрый ответ! – Meep

+0

Что такое вызов 'startActivityForResult()', который вызывает этот вызов 'onActivityResult()'? – CommonsWare

ответ

2

и вызов галерея видео

Нет, это не. Он позволяет пользователю выбирать любую активность, которая поддерживает ACTION_GET_CONTENT для MIME-типа video/*. Возвращаемый файл Uri может быть из любого, не обязательно «галерейного» приложения, и не обязательно того, что указывает на файл. Uri может указывать на:

  • A файла на внешнем хранилище, тот, который вы могли бы быть в состоянии напрямую читать
  • Файл на съемном носителе, который вы не можете получить доступ к
  • файле на внутренней памяти некоторых другое приложение
  • содержимое BLOB столбца в базе данных
  • то, что должно быть расшифровано на лету
  • что-то, что еще не существует на устройстве и нуждается в т о загрузить
  • и так далее

Способ получить путь видеофайла

только значения вы можете получить обратно от этого query(), надежно, являются OpenableColumns, для размера и «отображаемого имени» содержимого.

Вам нужно либо:

  • Используйте двигатель эскиз, который принимает contentUri в качестве параметра, или

  • Используйте ContentResolver и openInputStream() получить InputStream на содержание, а затем использовать некоторые thumbnail двигатель, который принимает значение InputStream в качестве параметра, или

  • Использование ContentResolver и openInputStream(), чтобы получить InputStream, а затем использовать этот поток для создания собственного файла, который содержит копию байтов из содержимого, поэтому вы можете использовать свой собственный файл с некоторым движком эскизов, который требует файла, или

  • не используйте ACTION_GET_CONTENT, но вместо того, чтобы сделать ваш собственный «Chooser» интерфейс, задавая MediaStore для всех видео, как вы можете получить эскизы этих видео из MediaStore (см this sample app)

+0

Мне нужно переварить эту информацию. Я буду отмечать это как ответ заранее. Спасибо. – Meep

+0

Я решил использовать 4-й вариант как самый простой способ устранить эту проблему. Это решение выглядит очень просто по сравнению с решениями, с которыми я работал. – Meep