مشکل در پخش فایل صوتی بصورت ناقص ! از SD_CARD
سلام دوستان
جدیدا با یک MediaPLayer ساده کلی مشکل پیدا کردم !
تمام نت رو هم گشتم اما مشکل حل نشد <
مدیا پلایر دقیقا با Warning زیر دیگه ادامه فایل رو پخش نمیکنه < و هر بار تا قسمتی از فایل رو پخش میکنه و تا نصفه قطع میشه !
MediaPlayer finalized without being released
این هم سورس :
MediaPlayer player = new MediaPlayer();
Uri uri = Uri.parse(G.DIR_APP + "/" + item.id + ".wd4"); // برای اینکه فایل در مدیا پلایر گوشی شناخته نشود تغییر پسوند دادم
player = MediaPlayer.create(G.context, uri);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
player.prepare();
}
catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
final MediaPlayer finalPlayer = player;
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
finalPlayer.start();
}
});
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
finalPlayer.release();
}
});






این هم یک روش دیگه برای دستیابی به فایل های صوتی :
String audioPath = G.PATH_SD_CARD+ audioFilename +".mp3";
FileInputStream fis =newFileInputStream(audioPath);
FileDescriptor fd = fis.getFD();
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(fd);
mediaPlayer.prepare();
mediaPlayer.start();

صدا زدن کد های بالا در یک Item از ListView اتفاق میافته < که این ListView در یک SlidingVIew (اسلایدینگ استاد) قرار داده < از اونجایی که شاید مشکلی در اون قسمت وجود داشته باشه من یک Button در ActivityMain هم گذاشتم < و اونجا هم تست کردم < که هیچ فرقی نکرد کلا هرجای پروژه صدا زده بشه به این مشکل بر میخوره !
فکر میکنم اگر در یک کلاس Helper هم اینکار انجام بشه باز هم همین مشکل وجود داشته باشه !

تمام خطوط برنامه رو Comment کردم < از کل برنامه فقط Oncreate مونده + یک Button <
و برای Button صدا زدم <
Helper.run();
هر چی روی Button کلیک میکنم < برنامه بخوبی کار میکنه < و صدا با موفقیت تا آخر پخش میشه <
برای تست خط بالا رو گذاشتم توی onCreate < و باگ برنامه پیدا شد < ! (الان میخوام کد های Helper رو پاک کنم و در Button بنویسم )
دلیل باگ چی میتونه باشه ؟ چرا از توی onCreate قابلیت اجرا شدن نداره ؟ !!!
یک کلاس Helper ساختم با کد های زیر <
package //
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.media.MediaPlayer;
import android.os.Environment;
public class Helper {
public static void run() {
String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/folder/file.mp3";
final MediaPlayer new_mediaPlayer = new MediaPlayer();
if ((new File(file).exists())) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
FileDescriptor fd = null;
try {
fd = fis.getFD();
}
catch (IOException e) {
e.printStackTrace();
}
try {
new_mediaPlayer.setDataSource(fd);
new_mediaPlayer.prepare();
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}
catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
new_mediaPlayer.start();
}
}
}

مشکل از متد زیر بود <
این متد رو نوشتم برای اینکه یک ImageVIew بصورت sliding داشته باشم <
private void SlideShow() {
Thread slideThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
countSliding++;
if (countSliding >= 31) {
countSliding = 1;
}
final int res = getResources().getIdentifier("com.freestyler.MYAPP.criss:drawable/img" + countSliding, null, null);
try {
Thread.sleep(3500);
imgSlideShow.post(new Runnable() {
@Override
public void run() {
imgSlideShow.setImageResource(res);
Animation slideAnimation = AnimationUtils.loadAnimation(G.context, R.anim.slide_right);
imgSlideShow.setAnimation(slideAnimation);
}
});
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
//slideThread.start();
}
حالا چطور میتونم < این اسلادینگ شدن رو همچنان در حال اجرا نگهدارم ؟ < در واقع استفاده از دستور While(true) اینجا اشتباه هست ! <

عجب بدبختی گیر افتادیما <
این مشکل از Post کردن < نبود<
مشکل دقیقا زمانی هست < که تصویر جدید روی ImgSliding ست میشه < صدای موزیک پلیر قطع میشه !
imgSlideShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
countSliding++;
if (countSliding >= 31) {
countSliding = 1;
}
final int res = getResources().getIdentifier("com.freestyler.MYAPP.criss:drawable/img" + countSliding, null, null);
imgSlideShow.setImageResource(res);
//Animation slideAnimation = AnimationUtils.loadAnimation(G.context, R.anim.slide_right);
//imgSlideShow.setAnimation(slideAnimation);
}
});

تعداد 30 عکس بصورت imgX در فولدر Drawable وجود داره <
با استفاده از کد زیر گرفته میشه < و در ImageView قرار میگیره
countSliding++;
if(countSliding >=31){
countSliding =1;
}
finalint* res = getResources().getIdentifier("com.freestyler.MYAPP.criss:drawable/img"+ countSliding,null,null);
imgSlideShow.setImageResource(res);
من با سورس زیر چک کردم < بصورت کاملا ساده وقتی عکسی روی ImageVIew ست میشه باعث قطع شدن صدا میشه !
از قبل با کلیک شدن صدا رو اجرا میکنم و کد زیر رو هم بعد اجرای صدا با کلیک شدن اجرا میکنم
Warning : MediaPlayer finalized without being released میده و صدا قطع میشه <
Random r = new Random();
if (r.nextBoolean()) {
imgSlideShow.setImageResource(R.drawable.img1);
} else {
imgSlideShow.setImageResource(R.drawable.img2);
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .