2016-04-10 4 views
1

Ich möchte mehrere Bilder als Anhang zu einer E-Mail hinzufügen. Daher versuche ich eine java.util.ArrayList zu einer E-Mail Intent hinzuzufügen. Die Liste enthält android.net.Uri Elemente. Aber es wirft ein ClassCastException:putParcelableArrayListExtra (ArrayList <Uri>) wirft ArrayList kann nicht in 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) 

ich es mit verschiedenen Typen für die Intent versucht. Verfahren nenne ich die Intent zu schaffen und die Activity starten:

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...")); 
} 

ich finden konnte keine Lösung. This hat mein Problem nicht gelöst.

Antwort

3

ACTION_SEND unterstützt EXTRA_STREAM, aber nur für eine einzige Uri. ACTION_SEND_MULTIPLE unterstützt EXTRA_STREAM mit einem ArrayList<Uri>. Also, entweder ändern Sie die Aktion oder ändern Sie das Extra.

+0

das Problem mit der Befestigung gelöst. Aber jetzt muss ich eine ArrayList als Text hinzufügen. (emailIntent.putExtra (Intent.EXTRA_TEXT, Text);). Ansonsten bekomme ich dort eine Cast Exception. –

+0

@ R.Schmitt: Denken Sie daran, dass 'ACTION_SEND *' nur * * EXTRA_TEXT' * oder * 'EXTRA_STREAM' zu beachten hat. Darüber hinaus müssen Sie, wenn Sie 'ACTION_SEND_MULTIPLE' verwenden, mehrere von' EXTRA_TEXT' und 'EXTRA_STREAM' senden, da die 'ACTION_SEND_MULTIPLE'-Implementierungen nach den [docs] (http://developer.android.org) suchen. com/Referenz/Android/Inhalt/Intent.html # ACTION_SEND_MULTIPLE). Sie können auch gerne mit der 'setClipData()' Option experimentieren und haben mehrere Elemente in den 'ClipData' mit' ACTION_SEND', aber nur eine Teilmenge der 'ACTION_SEND' Implementierungen wird dies berücksichtigen. – CommonsWare

+0

Danke für die wonderfu Antwort. Send_Multiple hat es geschafft .. :) :) –

0

Versuchen Sie, eine ArrayList von String s als Extra zum Intent setzen und dann, wenn die Extras von der nächsten Activity bekommen, es ist nur in Uri s analysieren zurück.

Siehe this answer

Verwandte Themen