に関連する大きな問題に直面していActivity
ます。私のシナリオは次のとおりです。
アクティビティ A を開始し、ボタンをクリックして、ギャラリーから画像を選択し、onActivityResult
を呼び出しstartActivity(B)
ました。
アクティビティ B で、A で選択した画像が表示されていListView
ます。
呼び出したボタンをクリックするstartActivityforResult(Recorder class)
と、カスタム ビデオ レコーダー アクティビティである新しいアクティビティが開かれました。
アクティビティレコーダーで停止ボタンをクリックするmediaRecorder
と停止し、ビデオをリリースして保存し、その後setResult
再びアクティビティBに移動しonActivityResult()
ます。しかし、ここに問題があります:
ここで見つけた2つの異なるケース:
1 つ目は、Recorder クラスを Landscape として宣言したときです。
ここで Recorder クラスの停止ボタンをクリックすると、画面が真っ暗になり、数秒後にアクティビティ A が開始されます。
2 つ目は、Recorder クラスの向きを縦モードに変更したときです。
ここで Recorder クラスのアクティビティ B の停止ボタンをクリックすると (黒い画面は表示されません)、数秒後に再びアクティビティ A が開始されます。
ここで私が観察したもう1つのこと:
- アクティビティ B で置き換え
startActivityForResult()
、startActivity()
アクティビティ B を示すレコーダー アクティビティ i から再度呼び出しstartActivity(B)
ましたが、数秒後に同じアクティビティ B が再び開始された後、何か新しいことが起こります。 - これは、クラス
MediaRecorder
のすべてのメディア レコーダー コードにコメントしたときに問題がなかったからだと確信しています。Recorder
私の Code of Recorder クラスは次のとおりです。
public class Recorder extends Activity implements SurfaceHolder.Callback{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mediaRecorder = new MediaRecorder();
setContentView(R.layout.recorde);
initMediaRecorder();
timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
if(counter<=10)
counter++;
//Android UI get Updated continouly
else {
// If condition full filled the timer will stop here
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
timer.cancel();
Recorder.this.finish();
Intent i = new Intent(Recorder.this,B.class);
setResult(Activity.RESULT_OK, i.putExtra("returnedVideo", strPath));
}
}
};
timer.schedule(timerTask, 1000, 1000);
SurfaceView myVideoView = (SurfaceView)findViewById(R.id.videoview);
surfaceHolder = myVideoView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
myButton = (Button)findViewById(R.id.mybutton);
myButton.setOnClickListener(myButtonOnClickListener);
}
private Button.OnClickListener myButtonOnClickListener
= new Button.OnClickListener(){
public void onClick(View arg0) {
// TODO Auto-generated method stub
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
timer.cancel();
Recorder.this.finish();
Intent i = new Intent(Recorder.this,B.class);
setResult(Activity.RESULT_OK, i.putExtra("returnedVideo", strPath));
}};
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
prepareMediaRecorder();
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
mediaRecorder.stop();
mediaRecorder.release();
//Recorder.this.finish();
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
mediaRecorder.stop();
mediaRecorder.release();
}
private void initMediaRecorder(){
Random genraotr = new Random();
int n = 10000;
n = genraotr.nextInt(n);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile camcorderProfile_HQ = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setProfile(camcorderProfile_HQ);
mediaRecorder.setOutputFile("/sdcard/my_video"+n+".mp4");
strPath = "/sdcard/my_video"+n+".mp4";
mediaRecorder.setMaxDuration(10000); // Set max duration 10 sec.
mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M
}
private void prepareMediaRecorder(){
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}