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

标签 android debugging stack-trace google-play

这是堆栈跟踪之一的示例,如何修复我的应用程序? Google Marketplace 中还有其他工具可以帮助我解决此问题吗?

java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1 at android.os.Parcel.readException(Parcel.java:1255) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) at android.content.ContentProviderProxy.insert(ContentProviderNative.java:450) at 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) at android.app.Activity.onMenuItemSelected(Activity.java:2206) at com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2781) at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158) at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:137) at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:876) at android.widget.AdapterView.performItemClick(AdapterView.java:284) at 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) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStart.main(Native Method)


编辑:

我实际上称它为函数 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, "audio/mpeg"); values.put(MediaStore.Audio.Media.ARTIST, "Unknown artist"); values.put(MediaStore.Audio.Media.IS_RINGTONE, false); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 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 卡上存储声音的目录中的声音时,我在某些手机上遇到了问题。

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

因此,为了在按下设置为铃声/通知/闹钟按钮时解决此问题,我将文件复制到 SD 卡上名为 \<sdard>\ringtones 的目录中。或\<sdard>\notifications\<sdard>\alarms我之前使用的代码在该位置运行良好。

最佳答案

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

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

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

祝你好运!

关于android - 我如何理解 Android 崩溃错误并纠正它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817755/

相关文章:

android - Unity3d 与 android 集成

c - gdb/ddd 在调试 assert() 时找不到 raise.c,它在我的主目录中查找

javascript - 如何调试由 Chutzpah/PhantomJS 执行的 JavaScript

xcode - 什么样的内存泄漏 XCode Analyzer 可能不会注意到?

iphone - iOS 应用程序启动时崩溃

python - 获取栈帧

android - Fresco 以编程方式将位图添加到缓存

android - 我无法获取 GPS 坐标

android - 从 fragment 动态获取 ImageView 中的图像总是返回 0 作为 resourceid

c# - 我如何遵循 .Net Native 神秘的堆栈跟踪?