2014-09-15 2 views
3

Я пытаюсь использовать Intent для обмена. Он хорошо работает с одним изображением или когда я использую Intent.ACTION_SEND.Intent + Share + Action_Send_Multiple + Facebook не работает

Но когда я использую Intent.ACTION_SEND_MULTIPLE Это, похоже, не работает в Facebook, например, я использую код ниже.

ArrayList<Uri> files = new ArrayList<Uri>(); 
    File a = new File(FileUtil.getDefaultMediaFolderPath(), "a.jpeg"); 
    File b = new File(FileUtil.getDefaultMediaFolderPath(), "b.jpeg"); 

    files.add(Uri.fromFile(a)); 
    files.add(Uri.fromFile(b)); 

    if (a.exists()) { 
     if (b.exists()) { 
      System.out.println("Both present."); 
     } 
    } 

    Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
    shareIntent.setType("*/*"); 
    shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files); 
    startActivity(Intent.createChooser(shareIntent,"share via.")); 

Над кодом хорошо работает с Gmail, и он прикрепляет фотографии с помощью Gmail. Но с facebook он не работает, и изображения не привязаны.

Я пробовал различную комбинацию, но ничего не работает. Хотя, когда я пытаюсь разделить несколько изображений с галереей по умолчанию, он работает хорошо и прикрепляет все изображения в Facebook.

Пожалуйста, помогите мне!

ответ

5

После многих попыток Наконец я пришел к решению, которое в текущей версии Facebook сломало намерение принять несколько изображений, когда они пришли как намерение. ACTION_SEND_MULTIPLE. Но я удивился, когда Multiple sharing работает с галереей по умолчанию на моем устройстве. Наконец-то с помощью моего друга (не хотел брать кредит у него). Я узнал, что по умолчанию GAllery отправляет файлы в URI, используя Поставщик контента Вот почему они работают Итак, я изменил свой список URI для Facebook (я создал собственный диалог совместного доступа, поэтому я могу перехватить, какая опция выбрана из Share Диалог открыт через Intent.)

private void updateUrisForFacebook() { 
    if (intent.getAction().equalsIgnoreCase(Intent.ACTION_SEND_MULTIPLE)) { 
     ArrayList<Uri> uris = intent 
       .getParcelableArrayListExtra(Intent.EXTRA_STREAM); 
     for (int i = 0; i < uris.size(); i++) { 
      Uri uri = uris.get(i); 
      String path = uri.getPath(); 
      File imageFile = new File(path); 
      uri = getImageContentUri(imageFile); 
      uris.set(i, uri); 
     } 
     intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
    } 
} 

private Uri getImageContentUri(File imageFile) { 
    String filePath = imageFile.getAbsolutePath(); 
    Cursor cursor = context.getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Images.Media._ID }, 
      MediaStore.Images.Media.DATA + "=? ", 
      new String[] { filePath }, null); 
    if (cursor != null && cursor.moveToFirst()) { 
     int id = cursor.getInt(cursor 
       .getColumnIndex(MediaStore.MediaColumns._ID)); 
     Uri baseUri = Uri.parse("content://media/external/images/media"); 
     return Uri.withAppendedPath(baseUri, "" + id); 
    } else { 
     if (imageFile.exists()) { 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.DATA, filePath); 
      return context.getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
     } else { 
      return null; 
     } 
    } 
} 

Наконец он работает :)

Так Основная идея заключается в преобразовании списка URI в сОДЕРЖАНИЯ список URI, а затем проверить это будет работать.

+0

Хорошо! Спасибо, что поделились анализом и решением. Оно работает! :) – Lisitso

+1

Да, я знаю, что я потратил 3 дня на это. Хорошо знать, что это помогает –

+0

Это, похоже, работает для множества приложений. Это здорово, однако вы не закрываете курсор в конце. И я не вижу смысла этой части после утверждения else. Тем не менее, я подтвердил ваш ответ и опубликую модификацию ниже. – Meanman

0

В дополнение к принятому ответ (который я upvoted) вот еще один метод, который также закрывает курсор:

private Uri getContentUri(Context context, String contentPath) { 
    Cursor c = context.getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[]{MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA}, 
      MediaStore.Images.ImageColumns.DATA + "=?", 
      new String[]{contentPath}, 
      null 
    ); 

    Uri contentUri = null; 
    try { 
     if (c != null && c.getCount() > 0 && c.moveToFirst()) { 
      int colId = c.getColumnIndex(MediaStore.Images.ImageColumns._ID); 
      if (colId > -1) { 
       int id = c.getInt(colId); 
       contentUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(id)); 
      } 
     } 
    } catch (Exception e) { 
    } finally { 
     try { 
      if (c != null) { 
       c.close(); 
      } 
     } catch (Exception e) {} 
    } 
    return contentUri; 
} 
Смежные вопросы