2013-10-21 5 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 대신 onPause()에 onStop()에있는 코드를 넣으면 홈 버튼도 눌러야합니다. – panini

2

MyMediaController.java에서 onCreate에서 활동 한 후

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

그리고 당신의 자신의를 MediaController

을 만듭니다. 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); 
관련 문제