簡體   English   中英

如何在AndroidStudio中從原始文件夾播放mp3file時修復java.lang.NullPointerException?

[英]How do i fix java.lang.NullPointerException in playing mp3files from a raw folder in AndroidStudio?

我想創建一個播放列表,以便當用戶單擊該歌曲時播放,而當他單擊下一首歌曲時,正在播放的歌曲將停止並恢復下一首歌曲。 此外,我還放置了一個停止按鈕,該按鈕也可以停止正在播放的歌曲。 現在,當我編寫以下代碼塊時,這就是問題,我的程序崩潰了,錯誤日志顯示了java.lang.NullPointerException-

 public void playSong(int res)
    {
        if(mp.isPlaying()) {
            mp.reset();
            mp = MediaPlayer.create(getApplicationContext(), resid[res]);
            mp.start();
        }

        else {
            mp = MediaPlayer.create(getApplicationContext(), resid[res]);
            mp.start();
        }


    }

但是,如果我將代碼更改為以下代碼,則效果很好。 我看到mp.reset()是問題。 但是我不知道如何解決它,因為如果沒有它,當我單擊一首歌曲並且已經有一首歌曲正在播放時,兩首歌曲會同時播放。

   public void playSong(int res)
    {
            mp = MediaPlayer.create(getApplicationContext(), resid[res]);
            mp.start();
     }

//以下是我的完整代碼。 請幫助我修復錯誤。 謝謝 -

package com.example.user.musicp;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {

    Button b;
    private MediaPlayer mp;
    private ListView v;
    private int [] resid = {R.raw.k,R.raw.u};
    private String [] name = {"k","u"};

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

        v = (ListView) findViewById(R.id.listView);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, name);

        v.setAdapter(adapter);
        b = (Button) findViewById(R.id.StopButton);

        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              //  mp.stop();
              //  mp.release();
                onDestroy();

            }
        });

        v.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                playSong(i);
              //  mp = MediaPlayer.create(MainActivity.this, resid[i]);
              //  mp.start();
            }
        });

    }

        public void playSong(int res)
    {
        if(mp.isPlaying()) {
            mp.reset(); //this is where the issue begins
            mp = MediaPlayer.create(getApplicationContext(), resid[res]);
            mp.start();
        }

        else {
            mp = MediaPlayer.create(getApplicationContext(), resid[res]);
            mp.start();
        }


    }

    @Override

    public void onDestroy() {

        super.onDestroy();
        mp.release();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

在此處輸入圖片說明

參考資料:-http: //www.geeks.gallery/how-to-play-mp3-file-from-raw-folder-in-a-listview-android/

經過一些用戶的寶貴建議后,我編輯了代碼,並能夠修復該錯誤。 但是,當我單擊一首歌曲並且已經播放了上一首歌曲時,這是事情,我希望上一首歌曲停止播放並播放新歌,但不幸的是,這兩首歌仍在播放。 我嘗試了所有可能的方法來修復它,但是我可能在某個地方犯了錯誤。 這是我編輯的代碼,當我實現以下代碼時,程序崩潰。 請幫我-

 public void playSong(int res)
    {



        boolean isplaying = mp.isPlaying();

         if(isplaying)
         {
             mp.stop();
             mp = MediaPlayer.create(getApplicationContext(), resid[res]);
             mp.start();
         }

         else
         {
             mp = MediaPlayer.create(getApplicationContext(), resid[res]);
             mp.start();
         }

}

這是完整的工作代碼,以防萬一將來有人卡住。 非常感謝StackOverflow用戶幫助我。 干杯!

package com.example.user.musicp;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.io.IOException;

public class MainActivity extends Activity {

    Button b,c;
    private MediaPlayer mp;
    private ListView v;
    private int [] resid = {R.raw.k,R.raw.u};
    private String [] name = {"k","u"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = new MediaPlayer();

        v = (ListView) findViewById(R.id.listView);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, name);

        v.setAdapter(adapter);
        b = (Button) findViewById(R.id.StopButton);
        c = (Button) findViewById(R.id.next);


        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mp.stop();


            }
        });

        c.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent in = new Intent("com.example.user.musicp.SPLASH");
                startActivity(in);
            }
        });
        v.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                playSong(i);
              //  mp = MediaPlayer.create(MainActivity.this, resid[i]);
              //  mp.start();
            }
        });

    }

        public void playSong(int res)
    {
        mp.reset();// stops any current playing song

        mp = MediaPlayer.create(getApplicationContext(), resid[res]);// create's
        mp.start(); // starting mediaplayer






    }

    @Override

    public void onDestroy() {

        super.onDestroy();
        mp.release();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
if(mp.isPlaying()) { // mp only declared (still null)
    mp.reset();
    mp = MediaPlayer.create(getApplicationContext(), resid[res]);
    mp.start();     }

else {
    mp = MediaPlayer.create(getApplicationContext(), resid[res]);
    mp.start();
}

我想在if語句mp的時候才聲明。 這就是為什么您不能執行mp.isPlaying()原因,因為mp仍然為null

那應該解釋為什么在這種情況下它可以正常工作

public void playSong(int res)
{
    // here mp is still null
    mp = MediaPlayer.create(getApplicationContext(), resid[res]); // From here on we can use mp
    mp.start();
 }

這里mp在初始化之前不使用,因此沒有空指針異常。

編輯:在playSong方法中創建mediaplayer playSong 這意味着每次調用playSong都會重新分配mp 更好的地方可能是在類的構造函數中。 這樣做可以確保在調用playSongmp不會為null

編輯2:您仍在playSong重新分配mp 我建議這樣做:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mp = MediaPlayer.create(getApplicationContext(), resid[res]);
    // ...
}

我會像這樣實現playSong

public void playSong(int songIndex)
{
    if(mp.isPlaying()) {
        mp.pause(); // Pause the current track
    }

    mp.selectTrack(songIndex); // Select the requested track
    mp.start();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM