如何在Xamarin Forms App中拦截Android设备的音量增大/减小按钮以打开相机?

扎克

我正在使用Xamarin Forms应用程序工作,该应用程序使用蓝牙快门答题器拍照。当前,单击时,蓝牙快门会激活音量增大/减小按钮。我试图拦截音量按钮,以便在单击答题器时可以打开设备摄像头。

我正在尝试使Android版本正常工作。我可以成功拦截MainActivity.cs文件中Android代码中的音量按钮。我认为我必须使用依赖项服务才能使我的CameraButton_Clicked事件由音量按钮触发,但是我对如何正确执行此操作一无所知。任何帮助将不胜感激。

MainActivity.CS:

//override the volume up/down buttons for bluetooth shutter clicker
        public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
        {
            if (keyCode == Keycode.VolumeDown)
            {
                return true;
            }

            if (keyCode == Keycode.VolumeUp)
            {
                return true;
            }
            return base.OnKeyUp(keyCode, e);
        }
        public override bool OnKeyDown(Keycode keyCode, KeyEvent e)
        {
            if (keyCode == Keycode.VolumeDown)
            {
                return true;
            }

            if (keyCode == Keycode.VolumeUp)
            {
                return true;
            }
            return base.OnKeyDown(keyCode, e);
        }

接口:

namespace MyApp
{
    public interface IBluetoothClicker 
    {
       object GetVolumeOverride();

    }
}

BluetoothClicker_Droid.cs:

[assembly: Xamarin.Forms.Dependency (typeof (BluetoothClicker_Droid))]
namespace MyApp.Droid
{
    public class BluetoothClicker_Droid: IBluetoothClicker
    {

        public BluetoothClicker_Droid ()
        {
        }

        public object GetVolumeOverride()
        {         
            //CameraButton_Clicked = true;

            return true;

        }
    }
}

CameraPage.xaml.cs:

public CameraPage()
        {
            InitializeComponent();

            CameraImage.Source = "CameraImage.png";
            TakePhotoButton.Clicked += CameraButton_Clicked; //opens camera

            Func<object> func = () =>
            {
                var obj = DependencyService.Get<IBluetoothClicker>().GetVolumeOverride();
                //obj += CameraButton_Clicked;
                return obj;
            };
        }

路Lu-MSFT

如果您只是想在android中实现。您可以像跟随GIF一样直接打开相机。

在此处输入图片说明

您可以在android中拍照,然后使用消息中心在PCL中上传您的图像,例如followcode。

MainPage.xaml.cs

      public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        CameraImage.Source = "CameraImage.png";


        MessagingCenter.Subscribe<App, string>(App.Current, "OpenPage", (snd, arg) =>
        {
            Device.BeginInvokeOnMainThread(() => {
                CameraImage.Source = arg;
            });
        });
    }   
}

MainActivity.cs

       public static class App_test
{
    public static File _file;
    public static File _dir;
    public static Bitmap bitmap;
}

[Activity(Label = "InterceptButton", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.SetVmPolicy(builder.Build());
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);


        LoadApplication(new App());

        if (IsThereAnAppToTakePictures())
        {
            CreateDirectoryForPictures();
        }
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    public override bool OnKeyUp([GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (keyCode == Keycode.VolumeDown)
        {
            Toast.MakeText(this, "OnKeyUp-VolumeDown", ToastLength.Short).Show();


            return true;
        }

        if (keyCode == Keycode.VolumeUp)
        {
          //  Toast.MakeText(this, "OnKeyUp-VolumeUp", ToastLength.Short).Show();
            return true;
        }

        return base.OnKeyUp(keyCode, e);
    }
    public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (keyCode == Keycode.VolumeDown)
        {
            Toast.MakeText(this, "OnKeyDown-VolumeDown", ToastLength.Short).Show();
            return true;
        }

        if (keyCode == Keycode.VolumeUp)
        {
            Intent intent = new Intent(MediaStore.ActionImageCapture);
               App_test._file = new File(App_test._dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid()));
               intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App_test._file));
            StartActivityForResult(intent, 0);
            Toast.MakeText(this, "OnKeyDown-VolumeUp", ToastLength.Short).Show();
            return true;
        }
        return base.OnKeyDown(keyCode, e);
    }


    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
        Uri contentUri = Uri.FromFile(App_test._file);
        mediaScanIntent.SetData(contentUri);
        SendBroadcast(mediaScanIntent);

        App_test.bitmap = App_test._file.Path.LoadAndResizeBitmap(100, 100);
       string path= App_test._file.Path;
        if (App_test.bitmap != null)
        {
            MessagingCenter.Send<App, string>(App.Current as App, "OpenPage", path);

            App_test.bitmap = null;
        }
        GC.Collect();
    }

    private void CreateDirectoryForPictures()
    {
        App_test._dir = new File(
            Environment.GetExternalStoragePublicDirectory(
                Environment.DirectoryPictures), "CameraAppDemo");
        if (!App_test._dir.Exists())
        {
            App_test._dir.Mkdirs();
        }
    }

    private bool IsThereAnAppToTakePictures()
    {
        Intent intent = new Intent(MediaStore.ActionImageCapture);
        IList<ResolveInfo> availableActivities =
            PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
        return availableActivities != null && availableActivities.Count > 0;
    }
}

所以我不知道为什么要使用DependencyService。也许您有更好的方法来实现。

有我的演示。我使用VS 2019,如果您使用VS 2017,它将有所不同。

https://github.com/851265601/InterceptButton

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Xamarin.Forms中检测设备的屏幕方向?

如何在 Xamarin Forms 中获取设备的 GPS 位置?

如何在 Xamarin Forms 中从 DependencyServic 打开 ActionCall Activity?

如何在Xamarin Forms Android按钮上设置填充?

如何在Xamarin.Forms中显示“向上” /“返回”按钮?

如何在 Xamarin Forms 中的按钮上创建网格

如何在Android Xamarin.Forms中修复Renderer警告

如何在 Xamarin.Forms 中实现 Android 服务

如何在Xamarin.Forms中隐藏Android ActionBar?

如何在 Xamarin Forms 中添加 Android .XML Vector Asset?

如何在Xamarin Forms中提供多设备支持

如何在Xamarin Forms上获得当前的设备型号?

如何在Xamarin Forms中用图像填充按钮?

如何在Xamarin.Forms上更改后退按钮文本

如何在Xamarin.Forms上更改后退按钮文本

如何在Xamarin.Forms中的网格中启用边框

如何在Xamarin.Forms中使用Android控件

如何在Xamarin.Forms上使用Android AutoCompleteTextView

Xamarin Forms - 如何在 Android 上检查 RequestIgnoreBatteryOptimizations 权限的设置

如何在Xamarin.Forms中修改WebView以在设备上的浏览器中打开链接?

如何在Xamarin.Forms中绑定Picker

如何在Xamarin.Forms XAML中绘制路径

如何在xamarin.forms中升级Firebase crashlytics

如何在Xamarin Forms for iOS中创建导航栏?

如何在Xamarin Forms中处理/取消向后导航

如何在Xamarin.forms中实现面板功能

如何在Xamarin Forms中向文本单元添加图标

如何在xamarin.forms中制作日历视图?

如何在Xamarin.Forms中强制使用灯光模式?