2016-04-27 1 views
3

Я пытался отправить видео в Instagram и Whatsapp, используя следующий код:Каков правильный способ формирования URI в видеофайл, который я намерен отправить в Whatsapp?

private void createShareIntent(String type, shareVectorList svList){ 

    // Create the new Intent using the 'Send' action. 
    Intent share = new Intent(Intent.ACTION_SEND); 

    // Set the MIME type 
    share.setType(type); 

    // Create the URI from the media 
    File media = new File(pathName); 
    Uri uri = Uri.fromFile(media); //This is the part I'm confused about 

    // Add the URI to the Intent. 
    share.putExtra(Intent.EXTRA_STREAM, uri); 

    switch(svList) 
    { 
     case INSTAGRAM: 
      share.setPackage("com.instagram.android"); 
      break; 
     case WHATSAPP: 
      share.setPackage("com.whatsapp"); 
      break; 
     default: 
      break; 
    } 

    // Broadcast the Intent. 
    startActivity(Intent.createChooser(share, "Share to")); 
} 

Когда я отправить видео в Instagram, он загружает штраф. Однако, когда я отправляю видео в Whatsapp, он просто показывает черный экран, на котором должна быть часть редактирования видео.

Когда я смотрю журналы Android, в нем указано исключение FileNotFoundException.

Кто-то сказал мне, что это из-за неправильного URI или URI, указывающего на какой-то файл, который не существует.

Я пробовал использовать Uri.parse("file://" + pathName), но он по-прежнему распределяет мне то же Исключение.

Я пытался получать URI из опрашивать ContentResolver «s со следующим кодом:

public Uri retrieveUriFromVideoPath(String pathName) { 
    File file = new File(pathName); 
    Cursor cursor = getContentResolver().query(
      MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Video.Media._ID }, 
      MediaStore.Video.Media.DATA + "=? ", 
      new String[] { pathName }, null); 
    if (cursor != null && cursor.moveToFirst()) { 
     int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Video.VideoColumns._ID)); 
     cursor.close(); 
     return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id); 
    } else { 
     if (file.exists()) { 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Video.Media.DATA, pathName); 
      return getContentResolver().insert(
        MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 
     } else { 
      return null; 
     } 
    } 
} 

Однако это только возвращает меня content://media/external/images/media/<video_file_id>, и то же самое исключение всплывает.

Мои вопросы:

  1. Как я должен сформировать URI, который ссылается на видео, которое я намерен поделиться с Whatsapp?
  2. Если это видео в пользовательской папке, которую я сгенерировал, будет работать тот же метод?
  3. Что делать, если имя файла содержит пробелы?

ответ

0

Оказывается, что сделал трюк с помощью FileProvider.

Я добавил следующее в манифесте:

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.example.thisFileProvider" 
    android:grantUriPermissions="true" 
    android:exported="false"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/path_to_this_app_directory_permanent" /> 
</provider> 

И для URI я просто должен сделать это: Uri uri = FileProvider.getUriForFile(this, "com.example.thisFileProvider", media);

Я искренне не могу поверить, что он взял меня это много времени, чтобы фигуры это из.