我正在尝试在Xamarin Forms中为我的android应用实现相机覆盖。当我将活动MainLauncher设置为True时,我可以使叠加层适用于Android。我该如何从Xamarin.Forms共享代码导航到活动页面,然后再导航回共享页面?
我的Android活动:
namespace CustomCamera.Droid
{
[Activity(Label = "CustomCamera", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class CameraOverlayDroid : IAndroidOverlay
{
public void StartAndroidActivity()
{
var intent = new Intent(Android.App.Application.Context, typeof(CameraPreview));
Android.App.Application.Context.StartActivity(intent);
}
}
public class CameraPreview : AppCompatActivity
{
public CameraPreview() { }
private CustomCameraManager _manager;
private Bitmap _currentBitmap;
private CameraResult _currentResult;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
//LoadApplication(new App());
SetContentView(Resource.Layout.Main);
//Resource.Layout.Main.setTitle("Hello StackOverflow");
_manager = new CustomCameraManager(this);
FindViewById<Android.Widget.Button>(Resource.Id.photo_button)
.Click += async (sender, args) => await Capture(new CameraRequest
{
Orientation = SurfaceOrientation.Auto,
UseFrontCamera = true,
InitialMessage = "Info message",
MaxWidthOrHeight = 1080,
CompressionQuality = 92,
Overlay = new Overlay(Resource.Drawable.face_silhouette, 15)
});
}
private async Task Capture(CameraRequest request)
{
try
{
var imageView = FindViewById<ImageView>(Resource.Id.preview_image);
if (_currentBitmap != null)
{
imageView.SetImageDrawable(null);
_currentBitmap.Recycle();
File.Delete(_currentResult.FilePath);
}
_currentResult = await _manager.GetPhoto(request);
_currentBitmap = await imageView.LoadFile(_currentResult.FilePath);
ShowMessage("it works");
}
catch (CameraNotAvailableException)
{
ShowMessage("Camera is not available");
}
catch (PermissionNotGrantedException)
{
ShowMessage("Permissions not granted to access camera or storage");
}
catch (CameraCancelledException)
{
ShowMessage("User has cancelled the operation");
}
catch (CameraException cameraException)
{
ShowMessage($"{cameraException.ErrorType}: {cameraException.Message}");
}
catch (Exception ex)
{
ShowMessage($"Something VERY wrong happened: {ex.Message}");
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
_manager?.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
_manager?.OnActivityResult(requestCode, resultCode, data);
}
private void ShowMessage(string message)
{
Debug.WriteLine(message);
Toast
.MakeText(this, message, ToastLength.Long)
.Show();
}
}
}
我的布局: Main.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center">
<ImageView
android:id="@+id/preview_image"
android:layout_width="match_parent"
android:layout_height="400dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_marginTop="15dp"
android:background="#dddddd" />
<Button
android:id="@+id/photo_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Photo" />
<Button
android:id="@+id/continue_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Continue" />
</LinearLayout>
答案 0 :(得分:1)
基本上,您必须在调用本机页面之前,以静态方法维护Xamarin.Forms页面的当前状态,如下所示:
public static Page GetSecondPage ()
{
var formsPage = new NavigationPage (new MyThirdPage ());
return formsPage;
}
然后从iOS获取您的页面实例,并按以下方式调用以下两行代码(ViewController上下文):
var secondViewController = App.GetSecondPage().CreateViewController();
NavigationController.PushViewController(secondViewController, true);
然后从您的Android活动中调用setpage方法,您的Android活动也应继承自Xamarin.Forms.Platform.Android.AndroidActivity
SetPage (App.GetSecondPage ());
祝你好运
在查询的情况下还原