首页 文章

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

提问于
浏览
2

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

java.lang.IllegalStateException:未知URL:content:// media / external / audio / albumart / -1,位于android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils,android.d.)上的android.os.Parcel.readException(Parcel.java:1255) . java:160)在android.content.ContentResolver.insert(ContentResolver.java:587)的android.content.ContentProviderProxy.insert(ContentProviderNative.java:450)的android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)处com.multi.board.series9button.function2(series9button.java:155)com.multi.board.series9button.onContextItemSelected(series9button.java:95)at com的android.app.Activity.onMenuItemSelected(Activity.java:2206) .android.internal.policy.impl.PhoneWindow $ ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2781)位于com.android.internal.view的com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158) .menu.MenuBuilder.performItemAction(MenuBuilder.java:855)at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuD) ialogHelper.java:137)在android.widget.ListView的android.widget.AdapterView.performItemClick(AdapterView.java:284)的com.android.internal.app.AlertController $ AlertParams $ 3.onItemClick(AlertController.java:876) . performItemClick(ListView.java:3382)在Android.os.Handler.dispatchMessage(Handler)上的android.widget.AbsListView $ PerformClick.run(AbsListView.java:1696)android.os.Handler.handleCallback(Handler.java:587) .java:92)在android.app.Looper.loop(Looper.java:144)的android.app.ActivityThread.main(ActivityThread.java:4937)java.lang.reflect.Method.invokeNative(Native Method)at at java.lang.reflect.Method.invoke(Method.java:521)位于com.android.internal.os.ZygoteInit.main的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 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”;文件k =新文件(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,“未知艺术家”); 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);

}


RESOLVED

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

当我将声音存储在sdcard上的目录中时,将铃声设置为声音时,我在某些手机上遇到了问题 .

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

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

2 回答

  • 1

    您所指的“Android崩溃错误”实际上是一个JAVA堆栈跟踪 . 谷歌搜索肯定会带来很多结果 . 我举几点指出:

    • 当抛出未捕获的异常时,会将此类堆栈跟踪转储到错误流中 .

    • 第一行包含异常的类名(在您的情况下为 java.lang.IllegalStateException ),后跟异常消息("Unknown URL: content://media/external/audio/albumart/-1") . 这告诉你发生了什么 .

    • 堆栈跟踪的其余部分包含有关它发生的位置的信息 . 由于函数相互调用,您将看到几个函数,它们被调用的顺序相反,每行一个函数 . 在你的例子中:
      文件 Parcel.java 中的 android.os.Parcel 方法 readException() 中出现

    • 异常 1255

    • 该方法由 android.database.DatabaseUtils 方法 readExceptionFromParcel() 在文件 DatabaseUtils.java 中调用 160

    • ......

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

    祝好运!

  • 5

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

相关问题