首页 > 解决方案 > 服务、setVolume 和 Seekbar

问题描述

我有一个带有 MediaPlayer 的服务。我想通过搜索栏改变活动量。但是,我无法调用在活动中输入服务的函数。它返回一个空对象。有没有人知道如何解决它。感谢您的帮助。

这是我的 Logcat。

2021-04-10 14:12:50.692 9483-9483/com.example.projectv3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.projectv3, PID: 9483
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.projectv3.Service_Music.setVol(float)' on a null object reference
    at com.example.projectv3.A_Sound$2.onProgressChanged(A_Sound.java:52)

这是我的代码。

活动 通过活动中的搜索栏改变音量。

public class A_Sound extends AppCompatActivity {

SeekBar seekBar;
Service_Music service_music;
float tmp=0;

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

    seekBar=findViewById(R.id.seekBar);
    seekBar.setMax(100);
    seekBar.setProgress(50);

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            
            tmp=(float)progress/100;
            service_music.setVol(tmp);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });


}

}

服务 在服务中设置 MediaPlayer,因为我想通过所有活动播放音乐。

public class Service_Music extends Service {
MediaPlayer myPlayer;


@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    //Toast.makeText(this, "Service Successfully Created", Toast.LENGTH_LONG).show();
    myPlayer = MediaPlayer.create(this,R.raw.music02);
    myPlayer.setLooping(true); // Set looping
}

public void setVol(float vol) {
    try{
        myPlayer.setVolume(vol,vol);
    }catch (IllegalStateException e){
        e.printStackTrace();
    }
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    myPlayer.start();
    return START_STICKY;
}

@Override
public void onDestroy() {
    //Toast.makeText(this, "Service Stopped and Music Stopped", Toast.LENGTH_LONG).show();
    if(myPlayer!=null){
        //stop playing
        if(myPlayer.isPlaying()){
            myPlayer.stop();
        }
        //release resource
        myPlayer.release();
    }
}

}

标签: javaandroidandroid-studioandroid-serviceandroid-mediaplayer

解决方案


推荐阅读