2017-01-18 1 views
0

Je reçois cette erreur lors de l'appel de ma méthode player.pause(); dans mon application. Je fais une pause dans la musique en utilisant ImageButton. J'appelle la méthode de la classe song_list pour mettre en pause la piste. Mais, exception suivante se produit:Exception de référence d'objet nulle lors de l'appel de méthodes mediaplayer

tentative d'invoquer une référence d'objet null méthode virtuelle 'android.media.MediaPlayer.pause() vide'

Ma MainActivity:

public class MusicKom extends AppCompatActivity { 

    private static String TAG = "PermissionDemo"; 
    public static final int REQUEST_READ_STORAGE = 112; 
    private ImageButton btplay; 
    private ImageButton pausemusic; 

    public void playbutton(int playbuttonid){ 

     btplay=(ImageButton)findViewById(R.id.play); 
     btplay.setBackgroundResource(playbuttonid); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_music_kom); 

     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 

     // Create an adapter that knows which fragment should be shown on each page 
     final viewpageadapter adapter = new viewpageadapter(getSupportFragmentManager()); 

     viewPager.setAdapter(adapter); 

     Button bt1 = (Button)findViewById(R.id.song_list); 
     Button bt2 = (Button)findViewById(R.id.album_list); 
     Button bt3 = (Button)findViewById(R.id.artist_list); 
     pausemusic = (ImageButton)findViewById(R.id.play); 


     bt1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
       viewPager.setCurrentItem(0); 
      } 
     }); 

     bt2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
       viewPager.setCurrentItem(1); 
      } 
     }); 

     bt3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
       viewPager.setCurrentItem(2); 
      } 
     }); 

     pausemusic.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       songs_list sl=new songs_list(); 
       sl.pauseplay(); 
       pausemusic.setBackgroundResource(R.drawable.stop); 
      } 
     }); 
    } 
} 

Ma liste de chansons Fragment:

public class songs_list extends Fragment { 

    // Adapter that exposes data from a Cursor to a ListView widget. 
    private MediaCursorAdapter mediaAdapter = null; 
    public MediaPlayer player; 
    private String currentFile=""; 
    private boolean isStarted = true; 
    private TextView selelctedFile = null; 
    private View v=null; 
    private String selectedtitem=null; 
    private int fileposition; 

    @Override 
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { 

     player = new MediaPlayer(); 

     // Use cursor to get data from external resource 

     final Cursor cursor = getActivity().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 


     // check Cursor has data or not 

     if (null != cursor) { 
      cursor.moveToFirst(); 

      mediaAdapter = new MediaCursorAdapter(getActivity().getApplicationContext(), R.layout.list_layout, cursor); 
      v=inflater.inflate(R.layout.fragment_songs_list, container, false); 

      ListView lv = (ListView)v.findViewById(android.R.id.list); 


      lv.setAdapter(mediaAdapter); 



      lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

        selectedtitem = (String) view.getTag(); 
        startPlay(selectedtitem); 
       } 
      }); 


     } 


     return v; 
    } 

    private void startPlay(String file) { 

     player.stop(); 
     player.reset(); 

     try { 
      player.setDataSource(file); 
      player.prepare(); 
      player.start(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     ((MusicKom) getActivity()).playbutton(R.drawable.play); 
    } 

    public void pauseplay(){ 
     Log.i(TAG, "pauseplay: "); 
     player.pause(); 
    } 
} 
+0

'logcat' s'il vous plaît. Votre 'player' est nul. Comment passez-vous 'player' à une autre activité? – rupinderjeet

+0

Désolé, ce n'était pas le code complet. Essayez maintenant. –

Répondre

0

Comment appeler une autre méthode d'activité hout lancer réellement l'activité. Dans votre cas, l'autre activité n'est pas chargée et l'objet media player n'est donc pas créé.

s'il vous plaît poster l'intégralité du code pour obtenir plus d'informations.

+0

J'ai mis à jour le code complet. –

0

Vous utilisez un fragment en tant que classe Java standard. Le fragment onCreateView() de Fragment n'est pas appelé lorsque vous instanciez Fragment. Il n'est appelé que lorsque vous affichez un fragment avec une FragmentTranscation valide. Voir Fragment Life cycle.

Commenter si vous voulez que le fragment apparaisse lorsque vous devez appeler pauseplay();, j'ajouterai le code approprié. Dans le cas contraire, vous devriez utiliser une classe Java régulière pour créer et lire/mettre en pause un lecteur multimédia depuis n'importe où. Quelque chose comme:

// package com.example.package_name; 

import android.media.MediaPlayer; 

public class SoundPlayer { 

    private MediaPlayer mediaPlayer; 

    // rawSongId is in form of 'R.id.song_name' 
    public SoundPlayer(Context context, int rawSongId){ 
     mediaPlayer = MediaPlayer.create(context, rawSongId); 
    } 

    public SoundPlayer(Context context, String dataSource){ 
     // handle media player with your data source 
    } 

    public void start(){ 
     if(mediaPlayer != null) { 
      mediaPlayer.start(); 
     } 
    } 

    public void pause(){ 
     if(mediaPlayer != null) { 
      mediaPlayer.pause(); 
     } 
    } 

    public void stop(){ 
     if(mediaPlayer != null) { 
      mediaPlayer.stop(); // reset(); ? 
     } 
    } 

} 

Maintenant, au lieu de

songs_list sl = new songs_list(); 
sl.pauseplay(); 

vous pouvez,

String dataSource = ""; // generate your dataSource here 

// initialize MediaPlayer with dataSource 
SoundPlayer soundPlayer = new SoundPlayer(this, dataSource); 

// Use its methods 
soundPlayer.start(); 
soundPlayer.pause(); 
soundPlayer.stop(); 

s'il vous plaît essayer d'utiliser une bonne camelCase coding conventions. Votre pauseplay() doit être pausePlay(); ou pauseOrPlay().

+0

ne fonctionne pas !! l'affichage de l'erreur dans la mainactivité ne peut pas résoudre le constructeur –

+0

E/MediaPlayer: pause appelée dans l'état 1 E/MediaPlayer: erreur (-38, 0) E/MediaPlayer: Erreur (-38,0) –