Я новичок в программировании для Android, и теперь у меня проблема с моим приложением. Я намерен закодировать приложение MediaPlayer с функцией: выберите файл из хранилища с помощью намерения, а затем начните воспроизведение этого файла. Я использую метод «MediaPlayer.create(context, uri)», но в настоящее время я получаю сообщение об ошибке
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//openFile();
Button openFile = (Button) this.findViewById(R.id.ButtonOpen);
openFile.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent chooseFile;
Intent intent;
chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("file/*");
intent = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(intent, ACTIVITY_CHOOSE_FILE);
Uri uri = intent.getData();
initViews(uri);
}
});
}
private void initViews(Uri uri) {
mButtonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
mButtonPlayStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buttonClick();
}
});
mMediaPlayer = MediaPlayer.create(this, uri);
}
private void starPlayProgressUpdater() {
mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
if (mMediaPlayer.isPlaying()) {
Runnable notification = new Runnable() {
@Override
public void run() {
starPlayProgressUpdater();
}
};
mHandler.postDelayed(notification, 1000);
} else {
mMediaPlayer.pause();
mButtonPlayStop.setText(getString(R.string.play_str));
mSeekBar.setProgress(0);
}
}
private void buttonClick() {
if (mButtonPlayStop.getText() == getString(R.string.play_str)) {
mButtonPlayStop.setText(getString(R.string.pause_str));
try {
mMediaPlayer.start();
starPlayProgressUpdater();
} catch (IllegalStateException e) {
mMediaPlayer.pause();
}
} else {
mButtonPlayStop.setText(getString(R.string.play_str));
mMediaPlayer.pause();
}
}
И он генерирует исключение NullPointerException в «mMediaPlayer = MediaPlayer.create(this, uri);». У него проблемы с uri. Может ли кто-нибудь указать мне путь?
Спасибо, Ilango j, я пересмотрел свой код, и теперь я могу выбрать и воспроизвести музыкальный файл. Но мое ожидание - это выбрать файл, а затем воспроизводить его только после нажатия кнопки «Воспроизведение/Пауза» (с индикатором выполнения), но я получил новое исключение NullPointerException с моей кнопкой.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = (Context) getApplicationContext();
Button openFile = (Button) this.findViewById(R.id.ButtonOpen);
openFile.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
initView();
}
});
}
private void initView() {
mButtonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
mButtonPlayStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buttonClick();
}
});
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 10);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_OK && requestCode == 10) {
Uri uri = data.getData();
mMediaPlayer = MediaPlayer.create(mContext, uri);
mSeekBar = (SeekBar) findViewById(R.id.SeekBar01);
mSeekBar.setMax(mMediaPlayer.getDuration());
mSeekBar.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
seekChange(v);
return false;
}
});
}
}
private void starPlayProgressUpdater() {
mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
if (mMediaPlayer.isPlaying()) {
Runnable notification = new Runnable() {
@Override
public void run() {
starPlayProgressUpdater();
}
};
mHandler.postDelayed(notification, 1000);
} else {
mMediaPlayer.pause();
mButtonPlayStop.setText(getString(R.string.play_str));
mSeekBar.setProgress(0);
}
}
private void seekChange(View v) {
if (mMediaPlayer.isPlaying()) {
SeekBar sb = (SeekBar) v;
mMediaPlayer.seekTo(sb.getProgress());
}
}
private void buttonClick() {
if (mButtonPlayStop.getText().equals(getString(R.string.play_str))) {
mButtonPlayStop.setText(getString(R.string.pause_str));
try {
mMediaPlayer.start();
starPlayProgressUpdater();
} catch (IllegalStateException e) {
mMediaPlayer.pause();
}
} else {
mButtonPlayStop.setText(getString(R.string.play_str));
mMediaPlayer.pause();
}
}
Не могли бы вы дать совет?