Sau khi đọc "Media Playback" và "MediaPlayer" tài liệu android tôi vẫn còn nhầm lẫn và cần tư vấn có kinh nghiệm về phương pháp quá tải setDataSource.MediaPlayer setDataSource cần lời khuyên thực hành tốt nhất
Tôi đang sử dụng MediaPlayer
trong thành phần Service
trong Dự án sẽ là foregroundService khi phát nhạc. Tôi có tệp nhạc của tôi (.mp3) trong thư mục res/raw
của gói ứng dụng của tôi. Để bắt đầu chơi, tôi biết tôi phải chuẩn bị đối tượng MediaPlayer. Bởi vì dịch vụ trong các ứng dụng Android theo mặc định sử dụng quy trình đơn và chủ đề chính, tôi không muốn người dùng của mình nhận được ANR trong khi MediaPlayer tự chuẩn bị (nghĩ rằng nếu tệp phương tiện trong thư mục thô có kích thước lớn). Sau đó, tôi sử dụng prepareAsync
thay vì prepare
(Đồng bộ). Vì vậy, tôi không thể sử dụng:
mp = MediaPlayer.create(context, R.raw.myfile);
Bởi vì đây đã kêu gọi prepare()
nội bộ nhưng không prepareAsync()
. Vì vậy, về cơ bản tôi có hai lựa chọn (hai từ bốn):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
hoặc
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
sau khi sử dụng một trong số họ đơn giản sử dụng Tôi có thể:
mp.prepareAsync();
Và cuối cùng câu hỏi của tôi phát sinh rằng "bao gồm các phương pháp khác nhau này, cái nào là lựa chọn tốt nhất? Có lợi ích nào khác không? Tôi có thiếu gì không?"
Cá nhân, tôi thích phương pháp cuối cùng vì nó không sử dụng chuỗi trong mã. Tôi không phải bây giờ nếu đó là số tiền của một "lợi ích", mặc dù. – Geobits
@Geobits, tránh chuỗi liên tục trong mã là một thực hành tốt như tôi biết nhưng 'FileDescriptor' là những gì android thích cho các tập tin địa phương. Cảm ơn bạn đã bình luận. và tôi đề nghị bạn đọc nhận xét của tôi về câu trả lời được chấp nhận. –