PDA

View Full Version : مشکل با پخش صوت



abbasalim
چهارشنبه 09 مرداد 1392, 14:50 عصر
بنام خدا
سلام
من یک مشکل عجیب دارم


package ir.esfandune.seda;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

MediaPlayer mp ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button b = (Button) findViewById(R.id.button1);
Button p = (Button) findViewById(R.id.button2);


mp = MediaPlayer.create(MainActivity.this, R.raw.mm);


b.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub

mp.start();

}
});
p.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub

mp.pause();

}
});



}


@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mp.stop();
}

}




الان یه مشکلی هست وقتی دکمه home رو میزنم آهنگ قطع میشه ولی وقتی داخل برنامه میرم و رو دکمه پخش کلیک می کنم آهنگ پخش نمیشه
در صورتی که اگه داخل برنامه دکمه back رو بزنم آهنگ قطع میشه و بعد هم که داخل برنامه میام روی دکمه پخش میزنم آهنگ پخش میشه:متفکر:

rubiks.kde
چهارشنبه 09 مرداد 1392, 15:39 عصر
توی قسمت اجرا به این صورت عمل کن
mPlayer.prepare();
mPlayer.start();

وزمانی هم که از برنامه بیرون میری به این صورت

mPlayer.stop();
mPlayer.release();

abbasalim
چهارشنبه 09 مرداد 1392, 17:38 عصر
خیلی عجیبه ولی نه تنها حل نشد بله الان اگه کلید home بزنم باره بعد که وارد برنامه میشم برنامه force close میده

abbasalim
چهارشنبه 09 مرداد 1392, 17:42 عصر
فعلا اینجوریش کردم ولی اگه دوستان راه حلی دارن بگن لطفا .ممنون


@Override
protected void onPause() {
// TODO Auto-generated method stub

mp.pause();
super.onPause();


}

Modernidea
جمعه 11 مرداد 1392, 04:57 صبح
سلام

مشکل زیاد عجیب که نیست، هیچ، کاملا هم منظقی است. (ولی خیلی سوال خوبی است!)

این شکل را زیاد دیدید، نه؟
چه جوابتون مثبت هست یا منفی، لطفا برای اولین یا چندمین بار خوب نگاه کنید. همه چی بر میگرده به این شکل یعنی "چرخه حیات اکتیویتی" .

108335

ببنید، وقتی شما دکمه Home را میزنید، برنامه به حالت onStop میره تا وقتی که توسط خودتون یا سیستم، برنامه کلا بسته بشه. پس شما دکمه Home را زدید و الان برنامه در حالت onStop قرار داره. وقتی برنامه را دوباره اجرا میکنید، برنامه چه مراحلی را طی میکند تا اجرا شود؟
دقیقا این مراحل:
1- onRestart
2- onStart
3- onResume

شما درون این سه متد، چه کد هایی نوشتید؟ در واقع هیچ!
شما تنها دو متد را Override کردید و آنها onCreate و onPause است.
در نتیجه، شما وقتی بعد از زدن دکمه Home دوباره برنامه را اجرا میکنید، هیچکدام از کدهای موجود در onCreate اجرا نمیشود و چون Button ها را به صورت سراسری تعریف نکرده اید، در نتیجه با به onPuase رفتن برنامه، منابع مربوط به Button ها آزاد شده و بعد از اجرای دوباره برنامه، Button ها مقدار دهی نمیشوند و فقط شکل آنها نمایش داده میشود! یعنی هیچ متدی به Button ها منتصب نمیشود. چرا؟ چون متد onCreate فراخوانی نشده است.

اما با زدن دکمه Back قضیه فرق میکند!
اگر در Activity اصلی قرار داشته باشید ودکمه Back را بزنید، برنامه به onDestroy رفته و finish میشود و تقریبا از حافظه خارج شده و اکثر یا تمام منابع آن آزاد میشود. در این صورت اگر برنامه دوباره اجرا شود، متد onCreate نیز اجرا شده و همه چیز از نو ساخته میشود.

راه حل مشکل شما:
Button ها را نیز مانند Media player به صورت سراسری تعریف کنید.

همیشه به چرخه حیات اکتیویتی توجه داشته باشید تا هم حافظه را صحیح مدیریت کنید و هم از بروز خطاها و اشتباهات احتمالی جلوگیری کنید.

موفق باشید.