【问题标题】:Android onActivityResultAndroid onActivityResult
【发布时间】:2012-12-19 06:24:54
【问题描述】:

我陷入了一种情况,根据我的应用程序图表流程描述如下:

假设我在 Activity A 上,在单击按钮时,我从图库中选择图像,选择后,我将移动到 Activity B(它来自 onActivity 结果内部 - 通过传递 Intent )。现在,当我在活动 B 上并单击按钮时,会调用自定义视频制作器。在这里,我拍摄了一个 10 秒的视频,然后我完成了(活动 C)使用

C.this.finish();

现在根据 Android 活动流程,我应该回到活动 B,但在我的情况下,我会在几秒钟内出现一个黑屏,然后是活动 A,而不是活动 B。 我不能透露我的代码,所以我没有附上它。对不起,同样。 如果有人可以帮助我提供这么多信息,请帮助我

代码:

点击按钮的活动B代码sn-p:

 btnTakeVideo.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {                
                Intent takePictureIntent = new Intent(TakeAnotherPhoto.this,Recorder.class);

                startActivityForResult(takePictureIntent,CreateAuctionScreen.ACTION_TAKE_VIDEO);
            }
        });

这里是 onActivityResult

onActivityResult()
if(requestCode == CreateAuctionScreen.ACTION_TAKE_VIDEO) {
            if (resultCode == RESULT_OK) {
                if(CreateAuctionScreen.resetBitmap!=null)
                {                
                    CreateAuctionScreen.resetBitmap = null;
                }                
                Drawable dd;
                dd = getResources().getDrawable(R.drawable.list_pic_frame2x);
                CreateAuctionScreen.bmpSize = ((BitmapDrawable)dd).getBitmap();

                if(data != null){


                    Uri str = data.getData();
                    String path = getRealPathFromURI(str);
                    System.out.println(path);

                    Bitmap bmp = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND);
                    CreateAuctionScreen.resetBitmap = Bitmap.createScaledBitmap(bmp, CreateAuctionScreen.bmpSize.getWidth(), CreateAuctionScreen.bmpSize.getHeight(), true);

                    if(CreateAuctionScreen.resetBitmap != null){

                        if(CreateAuctionScreen.thumbList.size() < 20){
                            dpv.set_chkString("Video");
                            dpv.get_chkString();
                            CreateAuctionScreen.chkList.add(dpv);
                            CreateAuctionScreen.str_thumbList.add(path);
                            CreateAuctionScreen.thumbList.add(CreateAuctionScreen.resetBitmap);

                            hl.setAdapter(new GallaryImageAdapter(TakeAnotherPhoto.this,CreateAuctionScreen.thumbList.size(),ImageAdapter.CREAT_AUCTION_SCREEN, CreateAuctionScreen.thumbList));
                        }else{
                            Toast.makeText(TakeAnotherPhoto.this, "You can add up to 20 pics & videos only", Toast.LENGTH_SHORT).show();
                        }
                    }
                }

活动 C(客户录像机)

public class Recorder extends Activity implements SurfaceHolder.Callback{

    Button myButton;
    MediaRecorder mediaRecorder;
    SurfaceHolder surfaceHolder;
    boolean back;
    Timer timer;
    int counter = 1;
    String strPath;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        back = false;

        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.release();
                    timer.cancel();
                    Intent i = new Intent();
                    setResult(RESULT_OK, i.putExtra("returnedVideo", strPath));

                    Recorder.this.finish();

                }
            } 
        };
        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.release();
            timer.cancel();

            Intent i = new Intent();
            setResult(RESULT_OK, i.putExtra("returnedVideo", strPath));
//            i.putExtra("returnedVideo", strPath);
//            i.putExtra("isRecorder", true);
//            startActivity(i);
            finish();
        }};

        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/auction_video"+n+".mp4");
            strPath = "/sdcard/auction_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();
            }
        }


        }
}

谢谢

【问题讨论】:

  • Activity B 启动 Activity C?
  • 您可以透露您用于启动活动的代码。我认为你这样做的方式可能是问题所在。也可能是您的 Activity B 无法处理“返回”导航并崩溃,这解释了黑屏并返回 A。
  • 首先,您是在活动 B 中呼叫finish() 吗?如果不是,则检查 logcat 输出以查看活动 B 是否由于异常而终止。即使没有异常,logcat 也应该显示活动 B 何时被销毁。您能否至少发布一份清单,说明您如何声明活动 A、B 和 C?
  • 从症状来看,B似乎成功接收到了C返回的数据。我怀疑问题出在createVideoThumbnail的调用上。我的猜测是,这是试图从 sdcard 中读取数据,并且必须进行大量处理才能创建缩略图。这发生在事件线程上,这可以解释黑屏。当它花费的时间太长(或者更有可能以某种方式失败)时,系统会杀死 B 并将您返回到 A。您可以使用调试器检查大部分内容。 logcat 输出在这里最有帮助。请张贴。
  • logcat 中是否有任何错误(活动 B 崩溃?)?您是否尝试过在 ActivityB.onActivityResult() 中设置断点?叫它吗?如果没有,它是否有正确的原型? (@Override?)

标签: android android-activity video-recording


【解决方案1】:

这似乎是 Activity B 中的一个例外。正如每个人都建议的那样,在 B 中调试 OnActivityResult 函数。检查您是否正在检索函数中“System.out.println(path)”打印的正确路径。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2019-01-23
    相关资源
    最近更新 更多