Я занимаюсь разработкой приложения, которое содержит экран просмотра списка, в котором хранятся все мелодии, поступающие с моего сервера. При нажатии на любую мелодию звонка она должна начать воспроизводить эту мелодию звонка, а после нажатия кнопки загрузки рядом с ней она должна начать загрузку этой мелодии. мелодию звонка, не мешая воспроизведению медиаплеера.
Вот расположение экрана моего рингтона моего приложения.
И я хочу поработать с этим Но рингтон не воспроизводится, когда рядом с CheckedTextView
.
отображается кнопка загрузки.
Все, что я хочу сделать, это запустить MediaPlayer
при щелчке по списку, приостановить его при повторном нажатии и загрузить рингтон при нажатии кнопки загрузки рядом с этим элементом.
Во время воспроизведения, чтобы показать природу воспроизведения, я использовал CheckedTextView
, который прекрасно работает, когда это только элемент, который должен быть накачан внутри списка. Но когда я добавляю кнопку загрузки рядом с ней, она не реагирует на щелчки.
Я просмотрел эту ссылку и эту ссылку, но не смог найти там никакой помощи.
Это мой фрагмент RingtonesActivity.java , где находится mediaPlayer
listView_ringtones.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listView_ringtones.setItemChecked(position, true);
url = ringtoneList.get(position).getUrl();
ringtoneTitle = ringtoneList.get(position).getTitle();
pDialog = ProgressDialog.show(activityContext, "Starting Ringtone: ", ringtoneTitle);
if (mediaPlayer != null) {
mediaPlayer.stop();
}
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
itemClicked = true;
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (pDialog.isShowing()) {
pDialog.dismiss();
}
mp.start();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
}
});
}
});
и это мой getView()
метод RingtoneAdapter.java
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.ringtone_list_item, parent, false);
holder = new ViewHolder();
holder.checkedTextView = convertView.findViewById(R.id.ringtone_checked);
holder.download = convertView.findViewById(R.id.ringTones_download);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String downloadFileUrl = ringtoneList.get(position).getUrl();
downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(downloadFileUrl);
DownloadManager.Request request = new DownloadManager.Request(uri);
Toast.makeText(context, "Downloading...", Toast.LENGTH_SHORT).show();
request.setTitle(ringtoneList.get(position).getTitle());
request.setDescription("in progress..");
request.setDestinationInExternalPublicDir("/AvengersRingtoneDownloads",
ringtoneList.get(position).getTitle() + ".mp3");
request.setVisibleInDownloadsUi(true);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
downloadManager.enqueue(request);
}
});
String title = ringtoneList.get(position).getTitle();
String duration = "\nDuration:" + ringtoneList.get(position).getDuration();
SpannableStringBuilder builder = new SpannableStringBuilder();
Spannable span = new SpannableString(title);
span.setSpan(new RelativeSizeSpan(1.0f), 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(new StyleSpan(Typeface.BOLD), 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(new ForegroundColorSpan(Color.rgb(16, 96, 122)), 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(span);
SpannableString blueSpannable = new SpannableString(duration);
blueSpannable.setSpan(new ForegroundColorSpan(Color.rgb(23, 163, 209)), duration.indexOf(duration), duration.length(), 0);
builder.append(blueSpannable);
holder.checkedTextView.setText(builder);
return convertView;
}
и вот мой listview_item.xml
<CheckedTextView
android:id="@+id/ringtone_checked"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:drawableStart="@drawable/checked_state_list_song"
android:gravity="center_vertical"
android:textSize="17sp"
xmlns:android="http://schemas.android.com/apk/res/android" />
вот мое определение списка
<ListView
android:id="@+id/listView_ringtones"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/sultan_taunting"
android:background="?attr/selectableItemBackground"
android:choiceMode="singleChoice" />
Может кто-нибудь сказать мне, что я делаю неправильно? Потому что я долго искал в интернете и не нашел обходного пути или правильного решения.