【发布时间】:2016-07-28 09:24:28
【问题描述】:
我正在从事一个音乐项目,我正在使用歌曲的 id 来找出它的标题。这是我用来这样做的功能。它在 MetadataFinder 类中。
public static String getSongFromID(long id, Context context) {
Uri mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE};
String selection = MediaStore.Audio.Media._ID + "=?";
String[] selectionArgs = new String[]{"" + id}; //This is the id you are looking for
Cursor mediaCursor = context.getContentResolver().query(mediaContentUri, projection, selection, selectionArgs, null);
if (mediaCursor.getCount() >= 0) {
mediaCursor.moveToPosition(0);
String title = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
return title;
//Do something with the data
}
return null;
}
到目前为止,这工作得很好。但是现在当我从另一部分代码调用此方法时,它会给出空指针异常。
我有两个片段从我发送广播到主要活动。主活动广播接收器调用服务中的一个函数,我们称之为 MainService。服务中的这个方法调用上面的方法getSongFromID。我从两个片段中调用此方法。对于 'id' 和上下文 'MainService.this' 的相同值,我在一种情况下得到异常,而另一种情况正常。
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference
at com.app.utils.MetadataFinder.getSongFromID(CommonUtils.java:331)
at com.app.services.MainService.playSong(MainService.java:189)
at com.app.activity.MainActivity.initPanelBottom(MainActivity.java:235)
at com.app.activity.MainActivity$1.onReceive(MainActivity.java:155)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
我不明白这背后的原因可能是什么,因为我发现任何涉及的参数都没有区别。谁能帮帮我!!
String title = MetadataFinder.getSongFromID(i, MainService.this);
这就是我调用 getSongFromId() 函数的方式。它是 MetadataFinder 类中的一个静态函数。
【问题讨论】:
-
mediaCursor是null。检查之前mediaCursor.getCount() -
query(...)方法可以返回null。 -
@Titus 是的,它可以,但是如果参数完全相同,为什么它在一种情况下返回 null 而不是另一种情况?
-
@RohitArya 是的,它为空,这就是我面临的问题。当其他参数相同时,为什么在一种情况下它为空,而在另一种情况下为空?该案例中唯一的变量是 context 和 id,这对于来自两个片段的调用都是相同的。在那种情况下,为什么其中一个调用导致 null 而其他调用正常?
-
可能你的数据库不允许多读,由于第一次没有关闭光标,第二次尝试将
Cursor返回为null。尝试关闭函数getSongFromID中的光标
标签: java android android-fragments android-cursor