2016-07-30 6 views
0

Я разрабатываю приложение для Android, в котором пользователь может читать книги и слушать записанные аудио для этой книги. Я использую флип-представление для переключения между страницами.остановить аудиоплеер, когда адаптер закрыт в приложении android

Вот моя основная деятельность:

private class FullBook extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(Personal_Library_Click.this); 
      pDialog.setMessage("Please wait..."); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... strings) { 

      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      params.add(new BasicNameValuePair("user_id", userId)); 
      params.add(new BasicNameValuePair("book_id", BookIdpref)); 

      json = jParse.makeHttpRequest(url_getBook, "GET", params); 

      try { 

       JSONArray jsonary = json.getJSONArray("list"); 

       Log.e("This is the books response", " " + json); 

       arrayVideos = new ArrayList<HashMap<String, String>>(); 
       for (int i = 0; i < jsonary.length(); i++) { 

        hashVideos = new HashMap<String, String>(); 


        JSONObject local_obj = (JSONObject) jsonary.get(i); 

        if (local_obj.toString().contains("image")) { 
         Image = local_obj.getString("image"); 
         hashVideos.put("image", Image); 
        } 

        if (local_obj.toString().contains("image_id")) { 
         ImId = local_obj.getString("image_id"); 
         hashVideos.put("imageId", ImId); 

        } 

        Log.e("Image ID : ", " " + ImId); 

        arrayVideos.add(hashVideos); 

       } 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      pDialog.dismiss(); 

      flipView.setAdapter(new FlipAdapter(Personal_Library_Click.this, arrayVideos)); 

     } 
    } 

И у нее мой адаптер:

public class FlipAdapter extends BaseAdapter implements OnClickListener { 

public interface Callback { 
} 

private LayoutInflater inflater; 
private Callback callback; 
private ArrayList<HashMap<String, String>> data; 
public lazyloading.ImageLoader imageLoader; 
private Activity activity; 

MediaPlayer mp; 

public FlipAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    activity = a; 

    data = d; 
    inflater = (LayoutInflater) activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader = new lazyloading.ImageLoader(activity.getApplicationContext()); 

} 

public void setCallback(Callback callback) { 
    this.callback = callback; 
} 

@Override 
public int getCount() { 
    return data.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public boolean hasStableIds() { 
    return true; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    if(convertView == null){ 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.page_flip, parent, false); 

     HashMap<String, String> hashmaparray = new HashMap<String, String>(); 
     hashmaparray = data.get(position); 


     holder.BookPages = (ImageView) convertView.findViewById(R.id.book_page); 
     holder.ShowVideo = (VideoView) convertView.findViewById(R.id.show_video); 
     holder.ShowVideo.setVisibility(View.INVISIBLE); 

     if(activity.toString().contains("Personal_Library_Click")){ 

      String image =hashmaparray.get("image"); 

      imageLoader.DisplayImage(image, holder.BookPages); 

     } 

     if(activity.toString().contains("AdminBookFlip")){ 

      String im = hashmaparray.get("image"); 
      imageLoader.DisplayImage(im, holder.BookPages); 

      String v = hashmaparray.get("video"); 

      mp=new MediaPlayer(); 

      try{ 
       mp.setDataSource(v);//Write your location here 
       mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
       mp.prepare(); 
       mp.start(); 

      }catch(Exception e) { 
       e.printStackTrace(); 
      } 

     } 

     if(activity.toString().contains("ViewBookVideo")) { 

      String im = hashmaparray.get("image"); 
      imageLoader.DisplayImage(im, holder.BookPages); 
     } 

     convertView.setTag(holder); 
    }else{ 

     holder = (ViewHolder) convertView.getTag(); 

    } 

    //TODO set a text with the id as well 

    return convertView; 
} 

static class ViewHolder{ 
    ImageView BookPages; 
    VideoView ShowVideo; 
} 

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
    } 
} 

} 

Когда я открываю эту деятельность он прекрасно работает. Но когда я закрываю активность, звук продолжает работать на заднем плане. Мне нужно остановить звук, когда я вернусь от этой активности. Я попытался сделать адаптер null onBackPressed(), но это не сработало. Может ли кто-нибудь помочь мне решить эту проблему? Благодаря

ответ

0

Pass MediaPlayer объект в вашем адаптере объекте класса и использовать этот объект в адаптере

MediaPlayer mp=new MediaPlayer(); 

flipView.setAdapter(new FlipAdapter(Personal_Library_Click.this, arrayVideos, mp));//mp is Mediaplayer object 


//Stop Audio 

    @Override 
    public void onPause(){ 
    //media player stops 
    super.onPause(); 
} 
+0

Hi Tejas ... !! Спасибо, я попробую это. –

+0

та же проблема создать снова? –

+0

Hi Tejas .. !! Да, проблема все еще сохраняется. Я попробовал ваше решение, но не работал для меня. Я не знаю, почему это происходит. Я попытался вызвать mp.stop() для всех методов onPause(). onStop(), OnResume(), onDestroy(), но до сих пор ничего не осталось. –

0

В первый по-моему, вы не должны делать это в адаптере. Фрагмент/Активность лучше для него. Тогда у вас есть метод, как onPause и onResume, который является лучшим местом для запуска и остановки MediaPlayer.

private MediaPlayer mediaPlayer; 
@Override 
public void onPause(){ 
    //media player stops 
    super.onPause(); 
} 
@Override 
public void onResume(){ 
    //mediaPlayer initialize and start 
    super.onResume(); 
} 
+0

Привет, J.D. Я уже пробовал это, но не работал для меня. В любом случае, спасибо за вашу помощь. –

+0

Я думал об этом немного, и я попытался использовать его в простом проекте. Это в основном работает отлично для меня, когда вы правильно обрабатываете медиаплеер и имеете правильный mp3 с ключевыми кадрами внутри. Попробуйте использовать метод mediaPlayer.pause() 'из метода onPause. Должно действительно работать на вас. У вас может даже быть некоторый метод 'adapter.stopMusic()' и вызывать его из 'onPause()', если хотите. –

+0

Здравствуйте, J.D. Я пробовал этот метод раньше, даже сделал метод, в котором я вызываю mp.stop(), и вызываю этот метод в onBackPressed(). в моей деятельности. Когда я попытался отладить класс, я обнаружил, что метод вызывается onBackPressed(), но звук все еще продолжается на бэкэнд. Я попытаюсь поместить метод adpater.stopMusic(), как вы сказали выше, и сообщите, работает ли это или нет. Большое вам спасибо за вашу помощь. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^