tru*_*ong 3 android file android-intent
我正在编写一个 Android 应用程序,其中我的服务需要将图像发送到其他一些应用程序(通过广播消息或启动服务 - 有多个应用程序可能有兴趣接收图像)。
如果我将图像加载到位图对象中并将其作为意图的“额外”,它实际上会起作用。但是,我想看看是否可以发送一个 ParcelFileDescriptor,并让客户端自行加载 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);
}
Run Code Online (Sandbox Code Playgroud)
执行此代码时,我总是收到一个 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。 robots.MyService@4161a0a8 与 Intent { cmp=com.test.robotsample/.MyService }: java.lang.RuntimeException: 不允许在此处写入文件描述符 01-01 08:06:02.589: E/AndroidRuntime(7483): at 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(7483):在 java.lang.reflect.Method.invokeNative(Native)方法)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.os.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.Bundle.writeToParcel(Bundle.java:1619) os.Parcel.writeBundle(Parcel.java:605)01-01 08:06:02.589:E / AndroidRuntime(7483):在android.content.Intent.writeToParcel(Intent.java:6470)01-01 08:06: 02.589:E / AndroidRuntime(7483):在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:06:02.589:E / AndroidRuntime(7483):在android.app.ActivityThread.handleServiceArgs(ActivityThread) .java:2490) 01-01 08:06:02.589: E/AndroidRuntime(7483): ... 10 更多
小智 5
是的,不可能通过 Intent 传递 ParcelFileDescriptor。尽管 Android 文档中似乎没有明确记录这一点。
备择方案:
| 归档时间: |
|
| 查看次数: |
4356 次 |
| 最近记录: |