2016-04-07 4 views
2

私は曲のIDを使用してタイトルを見つける音楽プロジェクトに取り組んでいます。これは私がそうするために使用する関数です。これはMetadataFinderクラスにあります。Context.getContentResolver()。(nullポインタ例外を指定します。

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; 
    } 

これまでのところうまくいきました。しかし、今では、コードの別の部分からこのメソッドを呼び出すと、nullポインタの例外が発生します。

私は主な活動に放送を送る場所から2つの断片があります。メインアクティビティのブロードキャスト受信者は、サービス内の関数を呼び出し、MainServiceと呼ぶことができます。サービス内のこのメソッドは、上記のメソッドgetSongFromIDを呼び出します。私は両方のフラグメントからこのメソッドを呼び出しています。 'id'とcontext '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を返し、もう一方ではnullを返すのですか? – varunkr

答えて

0

私は最終的にNguyen's提案のおかげで問題を解決することができました。私はそれを忘れてしまったすべての場所でカーソルを閉じ、最後に正しいことが働いた。

0

コンテンツプロバイダのクラスのonCreate()メソッドでヘルパークラスのオブジェクトを初期化してください。例えば

enter image description here