2016-02-24 3 views
0

В моем коде есть раздражающая ошибка, и я не могу спать из-за этого!Продолжайте получать NullPointerException для MediaPlayer

Я как-то понимаю, почему я могу получить его - я думаю, что-то связано с методом onCreate.

Это то, что у меня есть:

public class PredefinedUserPlayer extends Activity { 

    MediaPlayer mediaPlayer; 
    String names; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.userdefplayer); 
     names = "http://X.X.X.X/musikz/musikz01.mp3"; 
     mediaPlayer = new MediaPlayer(); 
    } 

    public void playSelectedFile() { 
     mediaPlayer = new MediaPlayer(); 
     try { 
      mediaPlayer.setDataSource(PredefinedUserPlayer.this, Uri.parse(names)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      mediaPlayer.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mediaPlayer.start(); 
    } 
} 

Метод playSelectedFile() вызывается в другом классе, и вот что бит кода здесь:

view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        PredefinedUserPlayer predefinedUserPlayer = new PredefinedUserPlayer() 
        predefinedUserPlayer.playSelectedFile(); 
       } 
      }); 

Я не могу иметь MediaPlayer в этом классе, поэтому мне пришлось создать экземпляр класса PredefinedUserPlayer. Это фактический трассировки стека (возможно, кто-то может помочь мне отлаживать и исправить эту досадную ошибку):

java.lang.NullPointerException 
      at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:99) 
      at android.media.MediaPlayer.setDataSource(MediaPlayer.java:882) 
      at android.media.MediaPlayer.setDataSource(MediaPlayer.java:859) 
      at lukasz.musik.PredefinedUserPlayer.playSelectedFile(PredefinedUserPlayer.java:86) 
      at lukasz.musik.CustomMusicAdapter$ViewHolder$1.onClick(CustomMusicAdapter.java:85) 
      at android.view.View.performClick(View.java:4240) 
      at android.view.View$PerformClick.run(View.java:17721) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5103) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

Замечательный, человек, который закрыл это пометил его как DUP другой вопрос помечается как DUP, который не отвечает на вопрос. –

+0

Точно! Мне пришлось переписываться, так как у меня никогда не было ответа на последний пост. @EJP, это действительно поможет, если вы перестанете отмечать мои сообщения как 'duplicate'. Они НЕ дубликаты, и если вы не можете ответить на вопрос, тогда не трогайте мой OP, пожалуйста! –

+0

Я проверил этот код. Замените его методом playSelectFile(). public void playSelectedFile() { mediaPlayer = новый MediaPlayer(); mediaPlayer.setAudioStreamType (AudioManager.STREAM_MUSIC); нить Thread = новый Thread() { @Override общественности недействительным запуска() { попытка { mediaPlayer.setDataSource ("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/ hosannatelugu.mp3"); } catch (IOException e) { e.printStackTrace(); } –

ответ

0

Вы не можете новый вид деятельности вручную, как это:

PredefinedUserPlayer predefinedUserPlayer = new PredefinedUserPlayer() 

Вы можете использовать Broadcast для достичь его, как это: ** во-первых, Зарегистрировать BroadcastReceiver в PredefinedUserPlayer активность:

public static String ACTION_PLAY = "ACTION_PLAY_FILE"; 
private final BroadcastReceiver mPlayFileReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 
     if (ACTION_PLAY.equals(action)) { 
       playSelectedFile(); 
     } 
    } 
}; 
IntentFilter intentFilter = new IntentFilter(ACTION_PLAY); 

LocalBroadcastManager.getInstance(this).registerReceiver(mPlayFileReceiver,intentFilter); 

во-вторых, отправить Broadcast с Actio п ACTION_PLAY информировать приемник, который будет вызван:

LocalBroadcastReceiver.getInstance(this).sendBroadcastSync(new Intent(PredefinedUserPlayer.ACTION_PLAY)); 
+0

Мне пришлось, потому что' onClickListener' был в другом классе –

+0

@ LukazsPioetrszci, вы можете использовать broadcastreceiver для его создания. – starkshang

+0

Как это сделать? –

Смежные вопросы