Android crash解决集锦

问题描述:

外接U盘长点击一文件夹选中后拨出OTG线提示停止运行

log内容:

----- timezone:GMT
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: FATAL EXCEPTION: main
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: Process: com.android.documentsui, PID: 5655
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: java.lang.RuntimeException: Unable to destroy activity {com.android.documentsui/com.android.documentsui.FilesActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4298)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4316)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.ActivityThread.-wrap6(ActivityThread.java)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1588)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:110)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:203)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6251)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:63)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.database.BulkCursorToCursorAdaptor.getCount(BulkCursorToCursorAdaptor.java:69)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:197)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.RootCursorWrapper.onMove(RootCursorWrapper.java:79)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:236)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.FilteringCursorWrapper.onMove(FilteringCursorWrapper.java:152)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:236)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.dirlist.Model.getItem(Model.java:450)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.dirlist.DirectoryFragment$SelectionModeListener.onItemStateChanged(DirectoryFragment.java:519)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.dirlist.MultiSelectManager.notifyItemStateChanged(MultiSelectManager.java:532)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.dirlist.MultiSelectManager.clearSelectionQuietly(MultiSelectManager.java:287)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.dirlist.MultiSelectManager.clearSelection(MultiSelectManager.java:262)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at com.android.documentsui.dirlist.DirectoryFragment.onDestroyView(DirectoryFragment.java:218)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.Fragment.performDestroyView(Fragment.java:2570)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1061)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:2067)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.FragmentController.dispatchDestroy(FragmentController.java:242)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.Activity.performDestroy(Activity.java:6867)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1153)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4285)
11-22 10:19:48.753412  5655  5655 E AndroidRuntime: 	... 9 more
分析解决:

11-22 10:19:48.753412  5655 5655 E AndroidRuntime: java.lang.RuntimeException: Unable to destroyactivity {com.android.documentsui/com.android.documentsui.FilesActivity}:android.database.StaleDataException: Attempted to access a cursor after it hasbeen closed.

 

crash原因是不能销毁活动,引起的原因是旧数据异常:试图访问一个已经关闭的游标。

 

根据报错log:at com.android.documentsui.dirlist.DirectoryFragment$SelectionModeListener.onItemStateChanged(DirectoryFragment.java:519)

 

public void onItemStateChanged(StringmodelId,boolean selected){

    finalCursor cursor=mModel.getItem(modeId);

    StringmimeType=null;

    if(cursor==null){

    ……

    }

}

应该是这里的cursor在拔掉OTG线的时候关闭了,而选中操作的监听事件还在试图引用cursor,这也直接导致了atcom.android.documentsui.dirlist.DirectoryFragment.onDestroyView(DirectoryFragment.java:218)这个方法报错,即无法销毁活动。

 

解决方法是设置一个布尔标志位isDestroyView,默认为false,当拔出OTG线也就是视图要销毁的时候,设为true,在onItemStateChanged方法中增加判断语句,如下

public void onItemStateChanged(StringmodelId,boolean selected){

    if(isDestroyView){

       return;

    }

    finalCursor cursor=mModel.getItem(modeId);

    StringmimeType=null;

    if(cursor==null){

    ……

    }

}

当视图销毁后就不进行事件的监听操作了。

不要忘记在onCreateView中对标志位进行恢复操作,置为false。


问题描述:横屏显示导致导航栏报错

log内容:

01-01 16:58:27.265 D/AndroidRuntime( 9998): Shutting down VM
01-01 16:58:27.266 E/AndroidRuntime( 9998): FATAL EXCEPTION: main
01-01 16:58:27.266 E/AndroidRuntime( 9998): Process: com.android.systemui, PID: 9998
01-01 16:58:27.266 E/AndroidRuntime( 9998): android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@57f46fc -- another window of type 2019 already exists
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at android.view.ViewRootImpl.setView(ViewRootImpl.java:789)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at com.android.systemui.statusbar.phone.NavigationBarFragment.create(NavigationBarFragment.java:726)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at com.android.systemui.statusbar.phone.StatusBar.createNavigationBar(StatusBar.java:1225)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at com.android.systemui.statusbar.phone.StatusBar.showNavigationBar(StatusBar.java:1239)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:506)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at android.os.Handler.dispatchMessage(Handler.java:105)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at android.os.Looper.loop(Looper.java:164)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at android.app.ActivityThread.main(ActivityThread.java:6565)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at java.lang.reflect.Method.invoke(Native Method)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
01-01 16:58:27.266 E/AndroidRuntime( 9998): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
分析原因:

已经存在一个type类型为2019的view,这里应该是创建view导致的,创建的方法是NavigationBarFragment.create,调用该方法进行创建的位置是createNavigationBar,生成的对象是mNavigationBarView,导致问题的原因应该就是它重复创建了,showNavigationBar调用createNavigationBar,最终是在showNavigationBar中实现创建,这里添加判断条件,当还存在相应的view时,不进行view创建。如下

if(showNav && mNavigationBarView ==null && mNavigationBar ==null){

createNavigationBar();

}


问题描述:

从文件管理器中使用音乐应用播放音乐报错

log内容:

FATAL EXCEPTION: main
01-01 13:22:35.082 E/AndroidRuntime( 9524): Process: com.android.music, PID: 9524
01-01 13:22:35.082 E/AndroidRuntime( 9524): java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=100, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.android.music/com.codeaurora.music.custom.PermissionActivity}: java.lang.SecurityException: UID 10095 does not have permission to content://com.android.providers.media.documents/document/audio%3A299 [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:4327)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.ActivityThread.handleSendResult(ActivityThread.java:4370)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.ActivityThread.-wrap19(Unknown Source:0)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1652)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.os.Handler.dispatchMessage(Handler.java:105)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.os.Looper.loop(Looper.java:164)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.ActivityThread.main(ActivityThread.java:6565)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at java.lang.reflect.Method.invoke(Native Method)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
01-01 13:22:35.082 E/AndroidRuntime( 9524): Caused by: java.lang.SecurityException: UID 10095 does not have permission to content://com.android.providers.media.documents/document/audio%3A299 [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.os.Parcel.readException(Parcel.java:1942)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.os.Parcel.readException(Parcel.java:1888)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4365)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1612)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Activity.startActivityForResult(Activity.java:4472)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Activity.startActivityForResult(Activity.java:4430)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Activity.startActivity(Activity.java:4791)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Activity.startActivity(Activity.java:4759)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at com.codeaurora.music.custom.PermissionActivity.onRequestPermissionsResult(PermissionActivity.java:127)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7388)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.Activity.dispatchActivityResult(Activity.java:7239)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:4323)
01-01 13:22:35.082 E/AndroidRuntime( 9524): 	... 9 more
分析解决:

根据log:Caused by: java.lang.SecurityException: UID 10095 does not have permission to content://com.android.providers.media.documents/document/audio%3A299 [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs,在对应位置给intent添加action,如下

mPreviousIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用程序在运行时遇到分段错误(Segmentation fault)通常是由于访问无效的内存地址或者内存溢出导致的。这种错误通常是由于编程错误引起的,比如空指针引用、数组越界访问等。解决这个问题的步骤如下: 1. 检查应用程序的日志:在Android Studio的Logcat窗口中查看应用程序的崩溃日志,找到相关的堆栈跟踪信息。这些信息可以帮助定位问题所在。 2. 确认问题发生的条件:尝试重现问题,并确定在什么情况下应用程序崩溃。这可能涉及到特定的用户操作或者特定的数据输入。 3. 检查代码:根据堆栈跟踪信息,找到可能导致问题的代码。检查是否有空指针引用、数组越界访问或者其他潜在的内存访问错误。 4. 使用调试工具:使用Android Studio提供的调试工具,如断点调试、内存监视器等,来帮助定位问题所在。通过在关键代码位置设置断点,可以逐步调试并观察变量值和内存状态,找到导致崩溃的具体原因。 5. 内存管理:检查应用程序的内存使用情况,确保没有内存泄漏或者内存溢出的情况发生。特别注意释放不再使用的资源和避免过度分配内存。 6. 第三方库和依赖项:如果应用程序使用了第三方库或者依赖项,确保它们的版本兼容性和稳定性。有时候问题可能是由于库的Bug导致的,需要更新或者排除这些库。 如果以上步骤无法解决问题,可以尝试使用其他工具进行更深入的分析,比如Memory Analyzer(MAT)等。另外,如果问题仍然存在,可以将相关信息提交给Google的Android开发者社区或者Stack Overflow等技术社区,寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值