如何理解Android崩溃错误并纠正它们

时间:2011-07-25 14:35:06

标签: android debugging stack-trace google-play

这是其中一个堆栈跟踪的示例,如何修复此应用程序?谷歌市场上还有其他工具可以帮助我吗?

  

java.lang.IllegalStateException:未知的URL:   content:// media / external / audio / albumart / -1 at   android.os.Parcel.readException(Parcel.java:1255)at   android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)   在   android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)   在   android.content.ContentProviderProxy.insert(ContentProviderNative.java:450)   在android.content.ContentResolver.insert(ContentResolver.java:587)at   com.multi.board.series9button.function2(series9button.java:155)at   com.multi.board.series9button.onContextItemSelected(series9button.java:95)   在android.app.Activity.onMenuItemSelected(Activity.java:2206)at   com.android.internal.policy.impl.PhoneWindow $ ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2781)   在   com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)   在   com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)   在   com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:137)   在   com.android.internal.app.AlertController $ AlertParams $ 3.onItemClick(AlertController.java:876)   在android.widget.AdapterView.performItemClick(AdapterView.java:284)   在android.widget.ListView.performItemClick(ListView.java:3382)at   android.widget.AbsListView $ PerformClick.run(AbsListView.java:1696)at   android.os.Handler.handleCallback(Handler.java:587)at   android.os.Handler.dispatchMessage(Handler.java:92)at   android.os.Looper.loop(Looper.java:144)at   android.app.ActivityThread.main(ActivityThread.java:4937)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:521)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)at   dalvik.system.NativeStart.main(原生方法)


编辑:

我实际上称它为功能2!什么是糟糕的编程。这是功能。问题是我无法通过手机或我试过的任何其他方式崩溃....

public void function2(int id){
      Toast.makeText(this, "Set as notification",
     

Toast.LENGTH_SHORT).show();             String sdcard =   。Environment.getExternalStorageDirectory()getAbsolutePath();

            String path = sdcard + "/multi10/" + Global.currentboard +
     

“/ series9”;

                  File k = new File(path, Global.currentsound);

                  ContentValues values = new ContentValues();
                  values.put(MediaStore.MediaColumns.DATA,
     

k.getAbsolutePath());                         values.put(MediaStore.MediaColumns.TITLE,   “MultiboardNotif”);                         values.put(MediaStore.MediaColumns.MIME_TYPE,   “音频/ MPEG”);                         values.put(MediaStore.Audio.Media.ARTIST,“未知   艺术家”);                         values.put(MediaStore.Audio.Media.IS_RINGTONE,   假);                         values.put(MediaStore.Audio.Media.IS_NOTIFICATION,   真正);                         values.put(MediaStore.Audio.Media.IS_ALARM,false);                         values.put(MediaStore.Audio.Media.IS_MUSIC,false);

                  Uri uri =
     

MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());

     

getContentResolver()。delete(uri,MediaStore.MediaColumns.TITLE +“= \”“”   +“MultiboardNotif”+“\”“,null);                     Uri newUri = getContentResolver()。insert(uri,values);

                  RingtoneManager.setActualDefaultRingtoneUri(
                    series9button.this,
                    RingtoneManager.TYPE_NOTIFICATION,
                    newUri);

  }

分辨

我现在明白崩溃错误现在是如何工作的!这就是我解决问题的方法:

当我将声音存储在SD卡中存储声音的目录中时,我在某些手机上遇到了问题。

我添加一个文件告诉媒体扫描程序不要扫描我目录中的文件并将它们添加到数据库中。

因此,当按下设置为铃声/通知/警报按钮时,为了解决此问题,我将文件复制到名为\<sdard>\ringtones\<sdard>\notifications\<sdard>\alarms的SD卡上的目录中我之前使用的代码在该位置工作正常。

2 个答案:

答案 0 :(得分:5)

您所指的“Android崩溃错误”实际上是一个JAVA堆栈跟踪。谷歌搜索肯定会带来很多结果。让我给你一些指示:

  • 当抛出未捕获的异常时,此类堆栈跟踪将转储到错误流中。
  • 第一行包含异常的类名(在您的情况下为java.lang.IllegalStateException),后跟异常消息(“Unknown URL:content:// media / external / audio / albumart / -1” )。这告诉你发生了什么。
  • 堆栈跟踪的其余部分包含有关它发生的位置的信息。由于函数相互调用,您将看到几个函数,它们的调用顺序相反,每行一个函数。在你的例子中:
    • android.os.ParcelreadException()的{​​{1}}方法Parcel.java中发生异常
    • 该方法由文件1255中的android.database.DatabaseUtils方法readExceptionFromParcel()DatabaseUtils.java
    • 调用
    • ......

您很可能对来自您的代码的LATEST(最顶层)方法调用感兴趣,因为99%的时间是导致错误的原因。在您的情况下,那是160(您将其解释为com.multi.board.series9button.function2(series9button.java:155)function2()中的com.multi.board.series9button。)

祝你好运!

答案 1 :(得分:1)

如果您使用的是eclipse或Netbeans,则可以使用内置调试器。就个人而言,我的方法(因为那个调试器有时候没用)是把“Log.d(”FileName“,”Message about location“);”在我的代码中。然后按照代码中的程序进行操作,当您收到该错误时,您将确切地知道它的位置。然后是解决它的乐趣...