2017-01-18 7 views
0

Я получаю эту ошибку при вызове метода player.pause(); в своем приложении. Я останавливаю музыку с помощью ImageButton. Я вызываю метод из класса song_list для приостановки дорожки. Но, происходит следующее исключение:Исключение исключения эталонного объекта при вызове методов медиапланера

Попытка вызвать виртуальный метод 'аннулируются android.media.MediaPlayer.pause()' на нулевой ссылки на объект

Мой 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); 
      } 
     }); 
    } 
} 

Мой song_list Фрагмент:

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' пожалуйста. Ваш «игрок» равен нулю. Как вы передаете «плеер» в другую деятельность? – rupinderjeet

+0

жаль, что это был не полный код. попробуй. –

ответ

0

Как вы можете назвать другой способ деятельности wit hout фактически запускает свою деятельность. В вашем случае другая активность не загружается и, следовательно, объект медиаплеера не создается.

, пожалуйста, разместите весь код, чтобы получить дополнительную информацию.

+0

Я обновил полный код. –

0

Вы используете Фрагмент как обычный класс java. Фрагмент onCreateView() не вызывается при создании экземпляра фрагмента. Он вызывается только тогда, когда вы показываете фрагмент с действительным FragmentTranscation. См. Fragment Life cycle.

Комментарий, если вы хотите, чтобы фрагмент отображался, когда вам нужно позвонить pauseplay();, я добавлю соответствующий код.

В противном случае вы должны использовать обычный класс java для создания и воспроизведения/приостановки мультимедийного проигрывателя из любого места. Что-то вроде:

// 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(); ? 
     } 
    } 

} 

Теперь, вместо

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

вы можете,

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(); 

, пожалуйста, попробуйте использовать соответствующую camelCase coding conventions. Ваш pauseplay() должен быть pausePlay(); или pauseOrPlay().

+0

не работает !! показывая ошибку в mainactivity не может разрешить конструктор –

+0

E/MediaPlayer: пауза вызывается в состоянии 1 E/MediaPlayer: ошибка (-38, 0) E/MediaPlayer: ошибка (-38,0) –