1

Я пытаюсь поделиться видео (в социальных сетях) в приложении, которое я создаю. Я использую намерения, для которых мне нужен Uri для разбора. Я пытаюсь выбрать элементы в простом файловом менеджере (активность списка), а затем делиться ими при длительном нажатии. Таким образом, мне нужен следующий код, чтобы получить Uri видео для его использования в намерениях.CursorIndexOutOfBoundsException при получении содержимого VideoUri из файла

ContentResolver contentResolver = ctx.getContentResolver(); 
    String videoUriStr = null; 
    long videoId = -1; 

    Uri videosUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 

    String[] projection = { MediaStore.Video.VideoColumns._ID }; 

    // TODO This will break if we have no matching item in the MediaStore. 
    Cursor cursor = contentResolver.query(videosUri, projection, 
      MediaStore.Video.VideoColumns.DATA + " =?", 
      new String[] { fileToShare }, null); 
    cursor.moveToFirst(); 
    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 
    cursor.close(); 
    if (videoId != -1) 
     videoUriStr = videosUri.toString() + "/" + videoId; 
    { 

     return videoUriStr; 
    } 

UPDATE Первые несколько элементов на файловом менеджере ListActivity файла разделит правильно. Но последние видео показывают ошибку.

Error: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

+0

Пути изменились с 4.2 и отличаются от предыдущих 4.2. Используйте Environment.getExternalStorageDirectory().getPath(), чтобы получить базовый путь к SD-карте, а не жестко кодировать его. –

+0

Не будучи жестко запрограммированным. Я использовал Environment.getExternalStorageDirectory(). GetPath() – pheno

ответ

0

я смог моя проблема решена, но я до сих пор не понимаю, почему я столкнулся с этой проблемой со старым кодом. Спасибо за помощь.

public static Uri getVideoContentUriFromFilePath(Context context, File fileToShare) { 
    String filePath = fileToShare.getAbsolutePath(); 
    Cursor cursor = context.getContentResolver().query(
      MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Video.Media._ID }, 
      MediaStore.Video.Media.DATA + "=? ", 
      new String[] { filePath }, null); 
    if (cursor != null && cursor.moveToFirst()) { 
     int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); 
     return Uri.withAppendedPath(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "" + id); 
    } else { 
     if (fileToShare.exists()) { 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Video.Media.DATA, filePath); 
      return context.getContentResolver().insert(
        MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 
     } else { 
      return null; 
     } 
    } 
} 
0

Использование во время цикла, чтобы проверить, является курсор есть данные или нет:

cursor.moveToFirst(); 
int columnIndex = cursor.getColumnIndex(projection[0]); 
videoId = cursor.getLong(columnIndex); 
cursor.close(); 

Replace с этим кодом:

while (cursor.moveToNext()){ 
    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 
} 
cursor.close(); 
+0

Согласен, что курсор равен NULL. Но я уверен, что данные на самом деле существуют в файловой системе. Я верю, что это неправильно передается в разрешитель контента. Так может быть, что-то не так с объявлением contentResolver? – pheno

1

курсор имеет 0 строк. Итак, строка cursor.getLong(columnIndex); throws CursorIndexOutOfBoundsException. проверьте нуль и проверьте, существуют ли какие-либо строки.

Если нет строк cursor.moveToFirst() вернет false.

Cursor cursor = contentResolver.query(videosUri, projection, 
      MediaStore.Video.VideoColumns.DATA + " =?", 
      new String[] { fileToShare }, null); 

if (cursor != null) { 
    if (cursor.moveToFirst()) { 
    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 
    cursor.close(); 
    if (videoId != -1) 
    { 
     videoUriStr = videosUri.toString() + "/" + videoId; 
    } 
    } 
} 
return videoUriStr; 

MediaStore.Video.VideoColumns.DATA поле содержит путь к видеофайлу. Итак, если вы используете uri (content://mnt/sdcard/Videos/test.mp4), чтобы получить файл, замените его на путь к файлу (/mnt/sdcard/Videos/test.mp4).

+0

Спасибо, но, является ли контент-резольвер неправильным принятием данных? – pheno

+0

Какое значение хранится в переменной 'fileToShare'? –

+0

Его путь к видеофайлу – pheno

0
Error: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

означает, что у вашего курсора нет данных.

использование проверка курсора пустота:

if (cursor.moveToFirst()) { 
    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 
} 
cursor.close(); 
0

Этот сценарий не зависит от модели телефона. Проблема в том, что ваш курсор не имеет данных.

Вы можете использовать cursor.moveToFirst(), который возвращает false, если курсор пуст, или используйте cursor.getCount(), чтобы узнать количество строк в курсоре.

например

if (cursor.moveToFirst()) { 
    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 
} 
cursor.close(); 

или

if (cursor.getCount() > 0) { 
    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 
} 
cursor.close(); 
+0

Так может быть, это и есть решение? – pheno

+0

Попробуйте передайте нулевой выбор, чтобы узнать, может ли contentResolver находить какие-либо данные.Это может дать некоторое представление. contentResolver.query (videosUri, projection, null, null, null); –

+0

Да, всплывающий выборщик. с правильным расположением файла? – pheno

0

первую очередь вам необходимо проверить размер курсора.

if(cursor.size()>0) 

{ // здесь мы

cursor.moveToFirst(); 
int columnIndex = cursor.getColumnIndex(projection[0]); 
videoId = cursor.getLong(columnIndex); 
cursor.close(); 
if (videoId != -1) 
    videoUriStr = videosUri.toString() + "/" + videoId; 
{ 

    return videoUriStr; 
} 
} 
Смежные вопросы