Android: исключение при отправке ParcelFileDescriptor через Intent
Я пишу приложение для Android, в котором моему сервису необходимо отправить изображение в некоторые другие приложения (через широковещательное сообщение или при запуске сервиса - есть несколько приложений, которые могут быть заинтересованы в получении изображения).
Если я загружаю изображение в растровый объект и помещаю его какЭкстра» Намерения это действительно будет работать. Тем не менее, я хочу посмотреть, смогу ли я вместо этого отправить ParcelFileDescrptor и позволить клиенту самостоятельно загружать объект Bitmap (при чтении спецификации создается впечатление, что ParcelFileDescriptor создан именно для этой цели - обмена файлами между процессами). Здесь я пытаюсь избежать отправки больших объектов через Intent. Итак, я написал что-то вроде этого:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("Service is called" + this.getClass());
Intent newIntent = new Intent(MY_ACTION);
try {
File icon = new File(getExternalFilesDir(null), "robot_icon.jpg");
icon.setReadable(true, false);
if( !icon.exists() ) {
System.out.println("Writting file " + icon);
FileOutputStream out;
out = new FileOutputStream(icon);
BitmapFactory.decodeResource(getResources(), R.drawable.two_face_answer_map).compress(CompressFormat.JPEG, 100, out);
out.close();
System.out.println("Closing file after writing" + icon);
}
newIntent.putExtra(EXTRA_BITMAP, ParcelFileDescriptor.open(icon, ParcelFileDescriptor.MODE_READ_WRITE));
// sendBroadcast(newIntent);
startService(newIntent);
} catch (FileNotFoundException e) {
Log.e(TAG, "Error opening robot icon file", e);
}catch (IOException e) {
Log.e(TAG, "Error opening robot icon file", e);
}
System.out.println("No Exception");
return super.onStartCommand(intent, flags, startId);
}
Когда этот код выполняется, я всегда получаю RuntimeException, которое говорит:Не разрешается писать дескриптор файла здесь ", Обратите внимание, что я вижу проблему как с sendBroadcast, так и с параметрами startService. Кто-нибудь знает, почему это здесь не разрешено? Что я сделал не так? Я неправильно понял ParcelFileDescriptor? Вот след:
01-01 08: 06: 02.589: E / AndroidRuntime (7483): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: главная 01-01 08: 06: 02.589: E / AndroidRuntime (7483): java.lang.RuntimeException: Невозможно запустить службу com.test. robotsample.MyService@4161a0a8 с намерением {cmp = com.test.robotsample / .MyService}: java.lang.RuntimeException: здесь не разрешается писать файловые дескрипторы 01-01 08: 06: 02.589: E / AndroidRuntime (7483): в android.app.ActivityThread.handleServiceArgs (ActivityThread.java:2507) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.app.ActivityThread.access $ 1900 (ActivityThread.java:130) 01-01 08 : 06: 02.589: E / AndroidRuntime (7483): на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1292) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.os. Handler.dispatchMessage (Handler.java:99) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.os.Looper.loop (Looper.java:137) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.app.ActivityThread.main (ActivityThread.java:4745) 01-01 08: 06: 02.589: E / AndroidRuntime (7 483): в java.lang.reflect.Method.invokeNative (собственный метод) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): в java.lang.reflect.Method.invoke (Method.java:511) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786) 01-01 08: 06: 02.589: E / AndroidRuntime ( 7483): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на dalvik.system.NativeStart.main (собственный метод) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): вызвано: java.lang.RuntimeException: не разрешено записывать дескрипторы файлов здесь 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android .os.Parcel.nativeWriteFileDescriptor (собственный метод) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.os.Parcel.writeFileDescriptor (Parcel.java:552) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.os.ParcelFileDescriptor.writeToParcel (ParcelFileDescriptor.java:412) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.o s.Parcel.writeParcelable (Parcel.java:1254) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.os.Parcel.writeValue (Parcel.java:1173) 01-01 08:06: 02.589: E / AndroidRuntime (7483): на android.os.Parcel.writeMapInternal (Parcel.java:591) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.os.Bundle.writeToParcel (Bundle) .java: 1619) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): в android.os.Parcel.writeBundle (Parcel.java:605) 01-01 08: 06: 02.589: E / AndroidRuntime (7483 ): at android.content.Intent.writeToParcel (Intent.java:6470) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): at android.app.ActivityManagerProxy.startService (ActivityManagerNative.java:2468) 01- 01 08: 06: 02.589: E / AndroidRuntime (7483): на android.app.ContextImpl.startService (ContextImpl.java:1149) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на android.content. ContextWrapper.startService (ContextWrapper.java:383) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): на com.test.robotsample.MyService.onStartCommand (MyService.java:63) 01-01 08: 0 6: 02.589: E / AndroidRuntime (7483): на android.app.ActivityThread.handleServiceArgs (ActivityThread.java:2490) 01-01 08: 06: 02.589: E / AndroidRuntime (7483): ... еще 10