Я делаю функцию поиска метаданных для моей программы Mediaplayer для Android.Я пытался получить Uri для функции setDataSource
из MediaMetadataRetriever(
).Однако Uri, который я получаю от своей активности выбора файлов, когда выбран мультимедийный файл, исчезает, и я получаю нулевую ссылку на объект при запуске функции получения метаданных.Я попытался запустить цикл while для расположения файла audioFileUri, чтобы убедиться, что Uri-файл мультимедиа хранился в памяти на протяжении всего жизненного цикла программы.Я озадачен тем, почему он возвращает нулевую ссылку на объект.
Пока я пытался:
Преобразование Uri в строку.
Изменение источника мета-ретривера для приема источника данных String.
Регистрация вывода audioFileUri, чтобы убедиться, что это адрес Uri значения медиа-файла.
Воспроизведение звука с SD-карты вместо Google Drive.
Использование data.getDataString () для получения местоположения медиа-файла в виде строки.
Вот код:
Основная активность:
public class MainActivity extends AppCompatActivity {
final int REQUEST_OPEN_FILE = 1;
MediaPlayer mediaPlayer = new MediaPlayer();
Uri audioFileUri;
SeekBar seekBar;
ImageView album_art;
TextView album, artist, genre;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar = findViewById(R.id.seekbar);
final Button playButton = findViewById(R.id.play);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
play();
}
});
final Button pauseButton = findViewById(R.id.pause);
pauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pause();
}
});
final Button stopButton = findViewById(R.id.stop);
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stop();
}
});
seekBar.setVisibility(View.INVISIBLE);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@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.open_file_action) {
Intent audiofile_chooser_intent;
audiofile_chooser_intent = new Intent();
audiofile_chooser_intent.setAction(Intent.ACTION_GET_CONTENT);
audiofile_chooser_intent.setType("audio/*");
startActivityForResult(Intent.createChooser(audiofile_chooser_intent,
getString(R.string.select_audio_file_title)), REQUEST_OPEN_FILE);
Toast.makeText(this, "File Chooser initiated..", Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.second_item) {
quit();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_OPEN_FILE) {
if (resultCode == RESULT_OK) {
audioFileUri = data.getData();
GetMetaData getMetaData = new GetMetaData();
getMetaData.metaRetriver();
}
}
startMediaPlayer();
}
public void startMediaPlayer() {
try {
if (mediaPlayer.isPlaying() || !mediaPlayer.isPlaying()) {
mediaPlayer.reset();
mediaPlayer.setDataSource(this, audioFileUri);
mediaPlayer.prepare();
mediaPlayer.start();
seekBar.setProgress(0);
seekBar.setMax(mediaPlayer.getDuration()); // Set the Maximum range of the
seekBar.setVisibility(View.VISIBLE);
} else {
mediaPlayer.setDataSource(this, audioFileUri);
mediaPlayer.prepare();
mediaPlayer.start();
seekBar.setProgress(0);
seekBar.setMax(mediaPlayer.getDuration()); // Set the Maximum range of the
seekBar.getVisibility();
seekBar.setVisibility(View.VISIBLE);
}
} catch (Exception e) {
e.printStackTrace();
}
int mediaPos = mediaPlayer.getCurrentPosition();
int mediaMax = mediaPlayer.getDuration();
seekBar.setMax(mediaMax); // Set the Maximum range of the
seekBar.setProgress(mediaPos);// set current progress to song's
handler.removeCallbacks(moveSeekBarThread);
handler.postDelayed(moveSeekBarThread, 300);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
seekBar.setProgress(progress);
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
public void quit() {
mediaPlayer.stop();
mediaPlayer.release();
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
System.exit(0);
}
public void play() {
if (!mediaPlayer.isPlaying() || mediaPlayer == null) {
mediaPlayer.start();
} else {
Log.i("DEBUG_TAG", "No File loaded");
}
}
public void pause() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
} else {
return;
}
}
public void stop() {
if (mediaPlayer != null || mediaPlayer.isPlaying() || mediaPlayer == null) {
seekBar.setProgress(0);
mediaPlayer.pause();
mediaPlayer.seekTo(0);
}
}
/*public void onDestroy() {
super.onDestroy();
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
}
}*/
private Runnable moveSeekBarThread = new Runnable() {
public void run() {
if (mediaPlayer.isPlaying()) {
int mediaPos_new = mediaPlayer.getCurrentPosition();
int mediaMax_new = mediaPlayer.getDuration();
seekBar.setMax(mediaMax_new);
seekBar.setProgress(mediaPos_new);
handler.postDelayed(this, 300); //Looping the thread after 0.1 second
// seconds
}
}
};
}
А вот мой класс получения метаданных:
public class GetMetaData extends MainActivity {
ImageView album_art;
TextView album, artist, genre;
MediaMetadataRetriever metaRetriever;
byte[] art;
Uri audioMeta = audioFileUri;
public void metaRetriver() {
/*super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);*/
getInit(); // Ablum_art retrieval code
metaRetriever = new MediaMetadataRetriever();
if (audioMeta == null) {
return;
} else {
metaRetriever.setDataSource(this, audioMeta);
}
try {
art = metaRetriever.getEmbeddedPicture();
Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length);
album_art.setImageBitmap(songImage);
album.setText(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
artist.setText(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
genre.setText(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE));
} catch (Exception e) {
album_art.setBackgroundColor(Color.GRAY);
album.setText("Unknown Album");
artist.setText("Unknown Artist");
genre.setText("Unknown Genre");
}
}
public void getInit() {
album_art = (ImageView) findViewById(R.id.album_art);
album = (TextView) findViewById(R.id.Album);
artist = (TextView) findViewById(R.id.artist_name);
genre = (TextView) findViewById(R.id.genre);
}
ОТЛАДКА:
2019-02-13 12:31:58.622 18514-18514/com.example.macyg.androidmediaplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.macyg.androidmediaplayer, PID: 18514
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/12 flg=0x1 }} to activity {com.example.macyg.androidmediaplayer/com.example.macyg.androidmediaplayer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4360)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
at com.example.macyg.androidmediaplayer.GetMetaData.getInit(GetMetaData.java:46)
at com.example.macyg.androidmediaplayer.GetMetaData.metaRetriver(GetMetaData.java:21)
at com.example.macyg.androidmediaplayer.MainActivity.onActivityResult(MainActivity.java:110)
at android.app.Activity.dispatchActivityResult(Activity.java:7454)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)