Context.getContentResolver()。query()给出空指针异常

时间:2016-04-07 13:06:23

标签: java android android-fragments android-cursor

我正在制作一个音乐项目,我正在使用歌曲的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类中的静态函数。

2 个答案:

答案 0 :(得分:0)

由于Nguyen's的建议,我终于能够解决我的问题了。我在所有忘记这样做的地方关闭了我的游标,最后事情正常。

答案 1 :(得分:0)

确保在Content Provider的类的onCreate()方法中初始化Helper类的对象。

例如:

enter image description here