2016-04-07 92 views
2

我正在製作一個音樂項目,我正在使用歌曲的ID來查找其標題。這是我用來這樣做的功能。它在MetadataFinder類中。Context.getContentResolver()。query()給出空指針異常

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類中的靜態函數。

+0

'mediaCursor'是'null'。檢查'mediaCursor.getCount()'之前'' –

+0

'query(...)'方法可以返回'null'。 – Titus

+0

@Titus是的它可以但爲什麼它在一個情況下返回null而不是另一個,如果參數完全相同? – varunkr

回答

0

我終於能夠解決我的問題,這要歸功於Nguyen's的建議。我在我忘記這麼做的所有地方關閉了我的遊標,最後事情正常。

0

確保您在Content Provider的類的onCreate()方法中初始化您的Helper類的對象。

例如:

enter image description here