بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

مشکل در پخش فایل صوتی بصورت ناقص ! از SD_CARD

مدیریت گفتگو
Criss 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام دوستان

جدیدا با یک 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();
}
});

نظرات

Criss 11 سال پیش
دوستان کسی نظری نداره ؟ چرا این مشکل وجود داره ؟ هرچی سرچ میکنم همه دقیقا به همین ترتیب فایل از SD_CARD میگیرن _ آموزش استاد هم از روی SD_CARD به همین شکل بود !
کاشی زاده 11 سال پیش
برای اینکه فایلتون در مدیا پیلر شناسخته نشه یک فایل خالی با پسوند .nomedia بسازید .
Criss 11 سال پیش
من فایل رو درون Dawable میزارم < بدون مشکل اجرا میشه < پس چرا از روی SD_CARD اجرا نمیشه ؟ میتونم اون رو Stream کنم روی حافظه ؟ و از روی Steram بخونم ؟
کاشی زاده 11 سال پیش
نه فرقی نمیکنه ، از این روش برای دسترسی به فایل استفاده کنید ببنید فرقی میکنه : mediaPlayer.setDataSource(this, soundUri);
Criss 11 سال پیش
این هم فرقی نمیکنه و دقیقا مثل URI عمل میکنه < فعلا باید سورسی که پایین گذاشتید رو تست کنم

پاسخ‌ها 6

کاشی زاده 11 سال پیش

این هم یک روش دیگه برای دستیابی به فایل های صوتی :

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();

نظرات

Criss 11 سال پیش
همه ی سورس ها رو در یک پروژه جدا گانه تست کردم < فقط این کد جواب داد < که متاسفانه در پروژه ی اصلی که قرار میدم < با همون Warning متوقف میشه ! < مشکل از تداخل کدنویسی شاید باشه !! چطور میتونم این مشکل رو پیدا کنم ؟ میتونه مشکل از ThreadMain باشه ؟
کاشی زاده 11 سال پیش
یک پروژه جدید و خالی باز کنید و فقط کد پخش رو داخل بنویسید تا جایی که امکان داره منابع باگ رو کم کنید و ببنید درست کار میکنه یا نه
Criss 11 سال پیش
دقیقا همین کار رو کردم و یک پروژه جدید ساختم (جداگانه) < که بخوبی کار میکنه < ولی در پروژه اصلی این اتفاق نمیافته
کاشی زاده 11 سال پیش
خب حالا تیکه تیکه کد های پروژه اصلی رو که استفاده کردی ببر تو پروژه جدید تا به باگ برسی.
Criss 11 سال پیش

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

فکر میکنم اگر در یک کلاس Helper هم اینکار انجام بشه باز هم همین مشکل وجود داشته باشه !

نظرات

Criss 11 سال پیش

تمام خطوط برنامه رو 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();
}
}
}

 

نظرات

Criss 11 سال پیش
خطی که مستقیما در onCreate جواب نمیداد < در Handler.postDelay جواب میده !!!
Criss 11 سال پیش
خطی که مستقیما در onCreate جواب نمیداد < در HANDLER.post هم جواب نـــمیده
Criss 11 سال پیش
توی onResume هم این اتفاق میافته و باعث میشه هرچی صدا از طریق کلیک شدن در حال اجرا هست < بسته بشه و از بین بره < (دلیل خطا هم Warning هست) MediaPlayer finalized without being released
Criss 11 سال پیش
دقیقا دیروز زیر همین لینک پست گذاشتم < با اسم < Criss
Criss 11 سال پیش

مشکل از متد زیر بود <

این متد رو نوشتم برای اینکه یک 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) اینجا اشتباه هست ! <

 

نظرات

Criss 11 سال پیش
دقیقا مشکل از < imgSlideShow.post(new Runnable() { < هست ! چرا ؟
Criss 11 سال پیش

عجب بدبختی گیر افتادیما <

این مشکل از 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);
}
});

 

نظرات

Criss 11 سال پیش
دقیقا زمانی که imgSlideShow.setImageResource(res) انجام میشه صدا قطع میشه !!! (یا مسیبت !) چرا اینجوریه ؟
کاشی زاده 11 سال پیش
این اسلاید شویی که استفاده کردید مربوطه به چه لایبری هست ؟ خودتون نوشتید یا از لایبری استفاده کردید ؟
Criss 11 سال پیش
کل اسلاید شو < همین کدی هست که در بالا نوشتم < تعداد 30 عکس رو به ترتیب از فولدر drawable میگیرم و با انیمیشن در یک ImageView با تاخیر 3500 میلی ثانیه نشون میده < خودم نوشتم و از لایبری استفاده نکردم < الان که دارم چک میکنم هر عکسی که از drawable روی ImageVIew ست میشه < باعث قطع شدن صدا میشه < دلیل قطع شدن صدا بصورت نصفه هم همین تاخیر زمانی 3500 میلی ثانیه در ست کردن عکس ها بوده
Criss 11 سال پیش

تعداد 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);
}

 

نظرات

کاشی زاده 11 سال پیش
پیلرتون رو در ترد جداگانه فعال کنید تا از هم جدابشن و ببنید حل میشه یا نه
Criss 11 سال پیش
متوجه منظورتون از "پیلر" نمیشنم ، چی هست ؟ < ولی کدهای متد slidingShow که کدش در بالا هست در یک ترد قرار داره < فعلا برای حل این مشکل < قصد دارم زمانی که قراره صدا اجرا بشه < مقدار درون while رو false کنم اینطوری همزمانی بین اجرای صدا و تغییر اسلادینگ حل میشه <
Pr0gramm3r 11 سال پیش
فکر کنم منظور محمد حسین جام پلیر بود ( player ) که یعنی همون Media Player :D
Pr0gramm3r 11 سال پیش
فکر کنم منظور محمد حسین جام پلیر بود ( player ) که یعنی همون Media Player :D
Criss 11 سال پیش
مشکل رو با دوتا while برای متد SlidingShow که متد در بالا کدهاش هست حل شد ، True , False کردم < اگر ممکنه بریم سراغ این سوال < لینک

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .