putParcelableArrayListExtra(ArrayList<Uri>) 抛出 ArrayList 无法转换为 android.os.Parcelable
putParcelableArrayListExtra(ArrayList<Uri>) throws ArrayList cannot be cast to android.os.Parcelable
我想添加多张图片作为电子邮件的附件。因此,我试图将 java.util.ArrayList
添加到电子邮件 Intent
。该列表包含 android.net.Uri
个元素。
但它抛出 ClassCastException
:
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 没有解决我的问题。
ACTION_SEND
支持 EXTRA_STREAM
,但仅支持单个 Uri
。 ACTION_SEND_MULTIPLE
支持 EXTRA_STREAM
和 ArrayList<Uri>
。所以,要么改变动作,要么改变额外的。
尝试将 String
中的 ArrayList
作为 Intent
的额外内容,然后在从下一个 Activity
中获取额外内容时,只需将其解析回Uri
s.
见this answer
我想添加多张图片作为电子邮件的附件。因此,我试图将 java.util.ArrayList
添加到电子邮件 Intent
。该列表包含 android.net.Uri
个元素。
但它抛出 ClassCastException
:
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 没有解决我的问题。
ACTION_SEND
支持 EXTRA_STREAM
,但仅支持单个 Uri
。 ACTION_SEND_MULTIPLE
支持 EXTRA_STREAM
和 ArrayList<Uri>
。所以,要么改变动作,要么改变额外的。
尝试将 String
中的 ArrayList
作为 Intent
的额外内容,然后在从下一个 Activity
中获取额外内容时,只需将其解析回Uri
s.
见this answer