Android区画でバインダーオブジェクトを見つけるにはどうすればよいですか? ビットマップを持つパーセルをマーシャリングしたいのですが、パーセルがバインダー オブジェクトを持っているという実行時例外が発生しました。
1 に答える
残念ながら、できません。残念ながら、 AParcel
は単なるバイト ストリームではありません。場合によっては、Binder と呼ばれるインテリジェント オブジェクトが含まれることがあります。これらのオブジェクトは、IPC を使用して渡すことができ、Android システムのさまざまな部分のさまざまなプロセスによって呼び出されるメソッドを持ちます。
それがこのケースで起こっていることです。あなたが呼び出しBitmap.writeToParcel()
たとき、OS の他の部分によって照会される必要があるインテリジェントなオブジェクトがそこに置かれています。これは、この Parcel を単純にバイト ストリームに縮小できないことを意味します。
(具体的には、これが起こっていると思いますが、間違っている可能性があります。このコード: http://androidxref.com/4.1.1/xref/frameworks/native/libs/binder/Parcel.cpp#736 はビットマップ データを共有メモリの領域に配置し、その共有メモリ領域への参照をパーセルに配置します。これは、データを頻繁にコピーする必要がないことを意味します。これは、パーセルを別のパーセルに渡す場合に優れています。 IPC を使用して処理しますが、データをシリアル化するためだけに使用している場合はあまり良くありません)。
使用するParcel.marshall
と、悪いデザインが示唆されることがあります...コメントにあるように、
ここで取得するデータは、いかなる種類の永続ストレージ (ローカル ディスク上、ネットワーク経由など) にも配置しないでください。そのためには、標準のシリアル化または別の種類の一般的なシリアル化メカニズムを使用する必要があります。マーシャリングされた Parcel 表現は、ローカル IPC 向けに高度に最適化されているため、異なるバージョンのプラットフォームで作成されたデータとの互換性を維持しようとはしません。
ローカル IPC に使用している場合は、呼び出す必要はありませんParcel.marshall
。通常、これらは自動的に処理される AIDL インターフェースの一部であるためです。
申し訳ありませんが、すぐに解決することはできません。IPC に使用している場合は、AIDL を使用してください。それ以外の目的で使用している場合は、使用しないでParcel.marshall
ください。代わりに、ビットマップ バイトを独自のデータ形式に書き込むためにさらに努力する必要があります。