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

Ответы на вопрос(1)

Ваш ответ на вопрос