2016-04-10 2 views
1

Я хочу добавить несколько изображений в качестве прикрепленного файла к электронному письму. Поэтому я пытаюсь добавить java.util.ArrayList по электронной почте Intent. Список содержит android.net.Uri элементов. Но это бросает ClassCastException:putParcelableArrayListExtra (ArrayList <Uri>) throws ArrayList нельзя отбрасывать на android.os.Parcelable

java.lang.ClassCastException: java.util.ArrayList cannot be cast to android.os.Parcelable 
at android.os.Bundle.getParcelable(Bundle.java:792) 
at android.content.Intent.getParcelableExtra(Intent.java:5377) 
at android.content.Intent.migrateExtraStreamToClipData(Intent.java:8144) 
at android.content.Intent.migrateExtraStreamToClipData(Intent.java:8124) 
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1505) 
at android.app.Activity.startActivityForResult(Activity.java:3917) 
at android.app.Activity.startActivityForResult(Activity.java:3877) 
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:843) 
at android.app.Activity.startActivity(Activity.java:4200) 
at android.app.Activity.startActivity(Activity.java:4168) 
at de.zinnet.parkingoffenders.ParkingOffendersActivity.sendEmail(ParkingOffendersActivity.java:135) 
at de.zinnet.parkingoffenders.ParkingOffendersActivity.onOptionsItemSelected(ParkingOffendersActivity.java:103) 
at android.app.Activity.onMenuItemSelected(Activity.java:2908) 
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:404) 

Я пробовал с разными типами для Intent. Метод, который я называю, чтобы создать Intent и начать Activity:

private void sendEmail() { 
    ParkingOffendersListFragment fragment = (ParkingOffendersListFragment) getFragmentManager().findFragmentById(R.id.fragment_list); 
    Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.setType("text/plain"); 
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    String[] to = {settings.getString(getResources().getString(R.string.key_receiver_mail), "")}; 
    emailIntent .putExtra(Intent.EXTRA_EMAIL, to); 

    String subject = settings.getString(getResources().getString(R.string.key_subject_mail), ""); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 

    String text = settings.getString(getResources().getString(R.string.key_template_mail), ""); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, text); 

    ArrayList<Parcelable> uris = new ArrayList<>(); 
    ParkingOffendersListAdapter adapter = fragment.getAdapter(); 
    for(ParkingOffender parkingOffender : adapter.getSelectedItems()) { 
     if(parkingOffender.getImageFilePath() != null) { 
      uris.add(Uri.parse(parkingOffender.getImageFilePath())); 
     } 
    } 
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 

    startActivity(Intent.createChooser(emailIntent , "Send email...")); 
} 

я не смог найти решение. This не решал мою проблему.

ответ

3

ACTION_SEND поддерживает EXTRA_STREAM, но только для одного Uri. ACTION_SEND_MULTIPLE поддерживает EXTRA_STREAM с ArrayList<Uri>. Таким образом, либо измените действие, либо измените дополнительное.

+0

Решена проблема с приложением. Но теперь я должен добавить ArrayList в качестве текста. (emailIntent.putExtra (Intent.EXTRA_TEXT, текст);). В другой ситуации я получаю Исключение Cast. –

+0

@ R.Schmitt: Во-первых, имейте в виду, что 'ACTION_SEND *' должен выполнять только * 'EXTRA_TEXT' * или *' EXTRA_STREAM'. Кроме того, если вы используете 'ACTION_SEND_MULTIPLE', вам нужно отправить несколько« EXTRA_TEXT »и« EXTRA_STREAM », поскольку реализация« ACTION_SEND_MULTIPLE »будет искать это в соответствии с [документами] (http://developer.android. ком/ссылки/Android/содержание/Intent.html # ACTION_SEND_MULTIPLE). Вы также можете поэкспериментировать с параметром 'setClipData()' и иметь несколько элементов в 'ClipData' с' ACTION_SEND', но только подмножество реализаций 'ACTION_SEND' будет соблюдать это. – CommonsWare

+0

Спасибо за чудо-ответ. Send_Multiple сделал трюк .. :) :) –

0

Попробуйте положить ArrayList из String s в качестве дополнительных к Intent, а затем при получении массовки назад от следующего Activity, просто разобрать его обратно в Uri с.

См this answer

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

  • Нет связанных вопросов^_^