Я делаю музыку. c Список песен в приложении проигрывателя фрагментирован, и теперь путь к песне, который я получил, использует MediaStore.Audio.Media.DATA
. Я успешно извлек путь, но некоторые из них содержат %20
в между путем (i.e, /storage/external_SD/Xender/audio/02%20Meherbani%20(The%20Shaukeens)%20%20%20%5BSongsMp3.Com%5D%20(SongsMp3.Com).mp3
) после преобразования String path в Uri
при попытке create
медиаплеера, как показано ниже, код не работает, что дает NPE
:
String url;
try {
url = java.net.URLDecoder.decode(listsong.get(position).getPath(), StandardCharsets.UTF_8.name());
uri1 = Uri.parse(url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//this below commented line is replaced in edited code by above code snippet
// uri1 = Uri.parse(listsong.get(position).getPath());
Log.e("Uri -> ", uri1.toString());
mediaPlayer = MediaPlayer.create(PlayerActivity.this, uri1);
metaDataMethod(uri1);
sName = listsong.get(position).getTitle();
song_name.setText(sName);
seekBar.setMax(mediaPlayer.getDuration() / 1000);
И ошибка, которая в logcat - это только когда щелкает по этому элементу:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.aman.playmusix/com.aman.playmusix.PlayerActivity}: java.lang.IllegalArgumentException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2378)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2440)
at android.app.ActivityThread.access$800(ActivityThread.java:162)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
Caused by: java.lang.IllegalArgumentException
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:73)
at com.aman.playmusix.PlayerActivity.metaDataMethod(PlayerActivity.java:426)
at com.aman.playmusix.PlayerActivity.getIntenMethod(PlayerActivity.java:550)
at com.aman.playmusix.PlayerActivity.onCreate(PlayerActivity.java:71)
at android.app.Activity.performCreate(Activity.java:6057)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
А при воспроизведении некоторых песен до того, как путь, содержащий %20 or %5
, идет так:
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.media.MediaPlayer.getDuration()' on a null object reference
Как решить проблему, спасибо.
Ниже приведен метод getIntent (), который я вызываю в oncreate ():
private void getIntenMethod() {
songName = getIntent().getStringExtra("title");
assert songName != null;
Log.e("Title : -> ", songName);
songPath = getIntent().getStringExtra("path");
assert songPath != null;
Log.e("Path : -> ", songPath);
position = getIntent().getIntExtra("position", -1);
Log.e("Position : -> ", "" + position);
// listsong = musicFiles;
Bundle bundle = getIntent().getExtras();
String jsonString = bundle.getString("KEY");
Gson gson = new Gson();
Type listOfdoctorType = new TypeToken<List<MusicFiles>>() {}.getType();
listsong = gson.fromJson(jsonString,listOfdoctorType );
if (listsong != null) {
pause_play.setImageResource(R.drawable.ic_pause);
if (shuffleBoolean)
shuffleBtn.setImageResource(R.drawable.ic_shuffle_on);
if (repeatBoolean)
repeatBtn.setImageResource(R.drawable.ic_repeate_on);
String url;
try {
url = java.net.URLDecoder.decode(listsong.get(position).getPath(), StandardCharsets.UTF_8.name());
uri = Uri.decode(url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// uri1 = Uri.fromFile(new File(listsong.get(position).getPath()));
// uri = Uri.parse(Uri.decode(listsong.get(position).getPath()));
metaDataMethod(uri);
Log.e("Uri -> ", uri.toString());
// (GradientDrawable) imgIcon.getBackground().getCurrent();
// gd.setColor(Color.parseColor("#000000"));
}
if (mediaPlayer != null)
{
mediaPlayer.stop();
mediaPlayer.release();
if (listsong != null)
{
mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.parse(uri));
mediaPlayer.start();
}
}
else
{
mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.parse(uri));
mediaPlayer.start();
}
seekBar.setMax(mediaPlayer.getDuration() / 1000);
}
Additionally I got decoded the uri from %whatever
Использование this . metaDataMethod()
:
public void metaDataMethod(Uri uri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(uri.toString());
String totalout = "";
String totaloutNew = "";
// get mp3 info
// convert duration to minute:seconds
String duration =
retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long dur = Long.parseLong(duration);
String seconds = String.valueOf((dur % 60000) / 1000);
String minutes = String.valueOf(dur / 60000);
totalout = minutes + ":" + seconds;
totaloutNew = minutes + ":" + "0" + seconds;
if (seconds.length() == 1) {
duration_total.setText(totaloutNew);
}else {
duration_total.setText(totalout);
}
}