Ответ 1
Думайте, что это очень широкая область, и может быть много ситуаций, которые могут вызвать это исключение на системном уровне. Но, возможно, этот пример того, как он был исправлен в конкретном проекте, может помочь кому-то.
Я испытал подобное исключение:
"Could not read input channel file descriptors from parcel"
на телефоне Samsung:
java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
at android.view.InputChannel.nativeReadFromParcel(Native Method)
at android.view.InputChannel.readFromParcel(InputChannel.java:148)
at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:690)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:525)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.widget.Toast$TN.handleShow(Toast.java:402)
at android.widget.Toast$TN$1.run(Toast.java:310)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Это произошло в большом старом проекте, который я получил для обслуживания, и эта плавающая ошибка произошла только через несколько часов. Я потратил довольно много времени на это, а также прочитал некоторые связанные ответы на SO в отношении этого и не имел понятия, кроме того, что это ошибка системного уровня Android, и в памяти должны быть дополнительные данные или дубликаты объектов или больших объектов и т.д.:
https://code.google.com/p/android/issues/detail?id=32470
Последнее, о чем я мог подумать, это SoundPool. Он не очень много использовал в проекте - время от времени воспроизводится не более 10 различных звуков.
Но это была первопричина! Иногда из SoundPool "unable to load sample (null)"
существовали плавающие исключения. И это помогло понять, что SoundPool использовался неправильно:
public void play(int rscId) {
...
final int soundId = soundPool.load(mContext, rscId, 1);
...
soundPool.play(soundId, volume, volume, 5, 0, 1f);
Итак, был создан новый идентификатор, и звуковой ресурс перезагружался каждый раз, когда приложение называлось звуковым методом воспроизведения! И через некоторое время некоторые независящие исключения начали происходить до тех пор, пока приложение не завершилось с исключением "Could not read input channel file descriptors from parcel"
.
Интересно, что одно из этих не связанных исключений: "ExceptionHandled in unable to open database file (code 14)"
:
ExceptionHandled in unable to open database file (code 14)
android.database.sqlite.SQLiteCantOpenDatabaseException:
unable to open database file (code 14)
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow
(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow
(SQLiteConnection.java:845)
И, конечно, ему нечего делать ни с базой данных, ни с тостами/посылками. Исправить эту конкретную ситуацию было очень просто: просто предварительно загрузите все звуки, как это было предложено в документации для Android:
http://developer.android.com/reference/android/media/SoundPool.html
"Логика загрузки повторяется через список звуков, вызывающих соответствующий SoundPool.load() function
. Обычно это делается на раннем этапе процесса, чтобы предоставить время для распаковки аудио в необработанный формат PCM, прежде чем они понадобятся для воспроизведения.
Как только звук загрузится и начнется воспроизведение, приложение может запускать звуки, вызывая SoundPool.play()
. "
Итак, я переместил soundPool.load() out from play() method
и исключение: "Could not read input channel file descriptors from parcel"
прошло, а также исключение "unable to open database file (code 14)"
.
public void play(int soundId) {
...
soundPool.play(soundId, volume, volume, 5, 0, 1f);
И soundPool.release(); soundPool = null
следует вызывать, когда он больше не нужен. И, возможно, это также может повлиять на такие исключения, см. Подробности здесь.
Не удалось прочитать дескрипторы файла входного канала из пакета
Скорее всего, это не точная ситуация для исходного вопроса, но надеюсь, что он может дать некоторую информацию, чтобы копать дальше. То есть поиск некоторых дополнительных исключений, проглатывание исключений или неправильные файлы/обработка данных.