2013-10-21 112 views
0

我正在爲我兒子的平板電腦上的電影編寫應用程序,並定期點擊後退或主頁按鈕。 2歲時他因失去了他正在觀看的視頻而感到沮喪。當他點擊主頁按鈕時,我可以保存狀態,因此當他重新回到應用程序時,電影會繼續。不幸的是,無論我如何設置後退按鈕,它總是從頭開始。按下後退按鈕後恢復視頻

我已經嘗試了onBackPressed和KeyDown方法,但他們完成似乎工作。我錯過了什麼嗎?

我感謝任何幫助,我很抱歉,如果這是重複的,我沒有找到它。

package com.example.toddlerplayer; 


import java.io.File; 
import java.util.ArrayList; 


import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Toast; 
import android.widget.VideoView; 
import com.example.scoobyplayer.R; 

public class MainActivity extends Activity implements OnGestureListener { 

    private VideoView videoview; 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private GestureDetector gDetector; 
    int i = 0; 
    int stopPosition = -1; 
    String startFile = "startFile"; 
    String startState = "startState"; 
    String startArray; 
    ArrayList <String> videoPaths = new ArrayList<String>(); 


@SuppressWarnings("deprecation") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    File dir = new File("/mnt/sdcard2/Movies/scooby/"); 

    videoview = (VideoView)findViewById(R.id.myvideoview); 
    videoview.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 

    if (savedInstanceState != null) { 
     videoPaths = savedInstanceState.getStringArrayList("movieList"); 
     i = savedInstanceState.getInt(startFile); 
     stopPosition = savedInstanceState.getInt(startState); 
    } else { 
     String [] chld = dir.list(); 
     for (int x =0; x <chld.length; x++) { 
       String fname = chld[x]; 
       videoPaths.add(dir+"/"+fname);  
     } 
    } 

    videoview.setVideoPath(videoPaths.get(i)); 
    //videoview.setOnCompletionListener(this); 
    //videoview.setOnPreparedListener(this); 
    //videoview.setOnTouchListener(this); 
    // Gesture detection 
    gDetector = new GestureDetector(this); 

    videoview.start(); 

    videoview.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(final MediaPlayer mp) { 
      i = (i + 1); 
      if (i >= videoPaths.size()) 
      { 
       finish(); 
      } else { 
       videoview.setVideoPath(videoPaths.get(i)); 
       videoview.start(); 
      } 

     } 

    }); 



} 
@Override 
public boolean onTouchEvent(MotionEvent me) { 
    boolean result = gDetector.onTouchEvent(me); 
    if(!result){ 
     if(me.getAction() == MotionEvent.ACTION_DOWN){ 
      if(videoview.isPlaying()){ 
       videoview.pause(); 
       result = true; 
      } else { 
       videoview.start(); 
       result = false; 
      } 
      //result = true;  
     } else { 
      result = false; 
     } 
    } 
    return result; 
} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    try { 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
      return false; 
     // right to left swipe 
     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      //Toast.makeText(MainActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show(); 
      i = (i + 1); 
      if (i >= videoPaths.size()) 
      { 
       i = 0; 
      } 
      videoview.stopPlayback(); 
      videoview.setVideoPath(videoPaths.get(i)); 
      videoview.start(); 
      Toast.makeText(MainActivity.this,videoPaths.get(i), Toast.LENGTH_SHORT).show(); 
     //left to right swipe  
     } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      //Toast.makeText(MainActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show(); 
      i = (i - 1); 
      if (i < 0) 
      { 
       i = videoPaths.size() - 1; 
      } 
      videoview.stopPlayback(); 
      videoview.setVideoPath(videoPaths.get(i)); 
      videoview.start(); 
      Toast.makeText(MainActivity.this,videoPaths.get(i), Toast.LENGTH_SHORT).show(); 
     } 
    } catch (Exception e) { 
     // nothing 
    } 
    return false; 
} 



@Override 
public boolean onDown(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
     return false; 
} 

@Override 
public void onLongPress(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
} 
@Override 
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { 
      // TODO Auto-generated method stub 
      return false; 
} 
@Override 
public void onShowPress(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
} 
@Override 
public boolean onSingleTapUp(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
     return false; 
} 
@Override 
public void onStop() { 
    super.onStop(); 
    stopPosition = videoview.getCurrentPosition(); 
    videoview.stopPlayback(); 
    //Toast.makeText(MainActivity.this,stopPosition, Toast.LENGTH_SHORT).show(); 
} 
@Override 
public void onStart() { 
    if (stopPosition != -1) { 
     videoview.seekTo(stopPosition); 
    } 
    videoview.start(); 
    super.onStart(); 
} 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(startState, stopPosition); 
    outState.putInt(startFile, i); 
    outState.putStringArrayList("movieList", videoPaths); 
    super.onSaveInstanceState(outState); 
} 
@Override 
protected void onResume() { 
    if (videoview != null) 
     videoview.seekTo(stopPosition); 
    videoview.resume(); 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    if (videoview != null) 
    stopPosition = videoview.getCurrentPosition(); 
    videoview.pause(); 
    super.onPause(); 
} 
@Override 
public void onBackPressed() { 
    stopPosition = videoview.getCurrentPosition(); 
    videoview.pause(); 
    super.onBackPressed(); 
} 
} 

回答

3

我看到你在onStop()存儲stopPosition和恢復,如果stopPosition != 0 - 然而stopPosition沒有被髮射之間持續存在。當用戶按下後退按鈕時,默認情況下您的活動已完成,這意味着您設置的任何字段狀態在下次啓動時都不會保留。

要解決此問題,您可以使用SharedPreferences來堅持stopPosition。例如:

private static final String KEY_POSITION = "KEY_POSITION"; 

@Override 
public void onStop(){ 
    super.onStop(); 
    stopPosition = videoview.getCurrentPosition(); 
    videoview.stopPlayback(); 
    persistStopPosition(stopPosition); 
} 

private void persistStopPosition(int stopPosition){ 
    SharedPreferences.Editor preferences = getSharedPreferences("Preferences", Context.MODE_PRIVATE).edit(); 
    preferences.putInt(KEY_POSITION, stopPosition); 
    preferences.commit(); // need this to ensure data is persisted. 
} 

,然後在onStart()

@Override 
public void onStart(){ 
    SharedPreferences preferences = getSharedPreferences("Preferences", Context.MODE_PRIVATE); 
    stopPosition = preferences.getInt(KEY_POSITION, -1); 
    if (stopPosition != -1) { 
     videoview.seekTo(stopPosition); 
    } 
    videoview.start(); 
    super.onStart(); 
} 
+1

這對我所需要的。價值正在按預期傳遞。但是,對於數組中目錄中的視頻文件,我還需要傳遞數組和數組的位置。以此作爲開始,我將努力將這些添加到共享首選項中。 – 123troy

+0

它工作的很好。但我想在主頁按鈕被按下後恢復視頻。可以請您分享該代碼..我嘗試使用onResume(),但上面的要求不適用於我。我想恢復視頻在後面按和主頁按鈕兩者。 – Pihu

+0

@PriyankaMinhas如果你把onStop()中的代碼放在onPause()中,它應該也可以按住home按鈕 – panini

2

創建您自己的MediaController

MyMediaController.java

public class MyMediaController extends MediaController { 
public MyMediaController(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyMediaController(Context context, boolean useFastForward) { 
    super(context, useFastForward); 
} 

public MyMediaController(Context context) { 
    super(context); 
} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    int keyCode = event.getKeyCode(); 
    if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) { 
     ((Activity) getContext()).finish(); 
     return true; 
    } 

    return super.dispatchKeyEvent(event); 
}} 

然後在你的onCreate活動。 VideoActivity.java

video=(VideoView)findViewById(R.id.vvVideo); 
    MyMediaController mediaController = new MyMediaController(this); 

    video.setMediaController(new MediaController(this){ 
     public boolean dispatchKeyEvent(KeyEvent event) 
     { 
      if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
       finish(); 

      return super.dispatchKeyEvent(event); 
     } 
    }); 
    video.setMediaController(mediaController);