处理设备旋转与相机活动

时间:2013-08-12 16:54:50

标签: android android-activity xamarin.android

我有一项活动,它首先要做的是发送相机意图。我希望用户拍照,然后我会用它来做某事。我的问题是,如果用户在拍摄照片时更改旋转,则应用程序会一直在相机内循环,直到他完成整个过程,同时保持单个设备方向。

以下是代码:

protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        _dateTextView = FindViewById<TextView> (Resource.Id.DateLabel);
        ViewModel.RecomendDishViewModel.RecomendationSent += RecomendationSent;
        if (IsThereAnAppToTakePictures())
        {
            CreateDirectoryForPictures();
            var imageButton = FindViewById<ImageButton> (Resource.Id.TakeImageWaterMark);
            _imageView = FindViewById<ImageView> (Resource.Id.UserDishImage);
            imageButton.Click += TakePictureClicked;
            if(_bitmap != null)
            {
                _imageView.RecycleBitmap ();
                _imageView.SetImageBitmap(_bitmap);
            }
        }
        _dateTextView.Click += DateLabelClicked;
        TakePictureClicked ()
    }
protected void TakePictureClicked ()
    {
        Intent intent = new Intent(MediaStore.ActionImageCapture);
        _file = new Java.IO.File(_dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid()));
        intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(_file));
        StartActivityForResult(intent, 0);
    }
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        // make it available in the gallery
        Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
        Uri contentUri = Uri.FromFile(_file);
        mediaScanIntent.SetData(contentUri);
        SendBroadcast(mediaScanIntent);

        // display in ImageView. We will resize the bitmap to fit the display
        // Loading the full sized image will consume to much memory 
        // and cause the application to crash.
        _bitmap = _file.Path.LoadAndResizeBitmap (518, 388);
        if(_bitmap != null)
        {
            MemoryStream stream = new MemoryStream();
            _bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            byte[] bitmapData = stream.ToArray();
            ViewModel.RecomendDishViewModel.ImageData = bitmapData;
            if(_imageView == null)
            {
                return;
            }
            _imageView.RecycleBitmap ();
            _imageView.SetImageBitmap(_bitmap);
        }
        _file.Dispose ();
        _dir.Dispose ();
    }

我的问题是重新创建活动然后再次启动相机应用程序。我尝试了很多东西(这是干净的版本),但没有任何完美的工作......

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这可能不是您正在寻找的解决方案,但您可以尝试在活动期间锁定屏幕旋转。

你可以在Android Manifest中设置它,如下所示:

<activity android:name="MyActivity" 
android:screenOrientation="portrait">
...
</activity>

这将在旋转设备时防止活动重绘。如果您觉得景观布局更适合您的活动,显然您可以将“肖像”替换为“风景”。

答案 1 :(得分:0)

在我提出建议之前,我建议保存活动的状态,就像问题一样。

可悲的是,我失败了。 :)

Save State

答案 2 :(得分:0)

要添加到Slack Shots,请回答您真正需要了解活动生命周期中发生的事情,您需要锁定应用程序的方向并防止更改或更好的方式(保存状态)或直接处理方向更改

http://developer.android.com/training/basics/activity-lifecycle/recreating.html