【问题标题】:TakePhotoAsync Camera not openTakePhotoAsync 相机未打开
【发布时间】:2019-03-28 17:02:51
【问题描述】:

我在网站上关注了非常多的教程和答案,但没有成功。花很多时间。

使用Media.Plugin,方法TakePhotoAsync()不打开相机(Genymotion 9.0 API-28 | device samsung j7 prime.android 8.0)。

PickPhotoAsync() 工作得很好。

AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.Pocidadao.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>

file_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="my_movies" path="Movies" />
  <external-path name="my_images" path="Android/data/com.companyname.Pocidadao/files/Pictures" /> 
</paths>

AssemblyInfo.cs

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesFeature("android.hardware.camera", Required = false)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = false)]

MainActivity.cs

protected override async void OnCreate(Bundle savedInstanceState)
{
    try
    {
...
        base.OnCreate(savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        await CrossMedia.Current.Initialize();
        CrossCurrentActivity.Current.Init(this, savedInstanceState);
        UserDialogs.Init(this);
        LoadApplication(new App());
    }
    catch (Exception ex)
    {
        Console.WriteLine("EXCEPTION HERE => "+ex);

...

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
    {
        Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

METHOD.XAML.CS

>>var 文件中的问题 = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions.. 但不是错误、异常等......

async void TakePhoto(object sender, EventArgs args)
        {
            try
            {
                if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
                {
                    await DisplayAlert("Ops", ":( Nenhuma câmera detectada.", "OK");
                    return;
            }

            var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
            var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);

            if (cameraStatus != PermissionStatus.Granted || storageStatus != PermissionStatus.Granted)
            {
                var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera, Permission.Storage });
                cameraStatus = results[Permission.Camera];
                storageStatus = results[Permission.Storage];
            }

            if (cameraStatus == PermissionStatus.Granted && storageStatus == PermissionStatus.Granted)
            {

        //===HERE IS THE PROBLEM, READ METHOD BUT NOT OPEN CAMERA! NOT ERRORS, NOT EXCEPTION, NOTHING===
                var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
                {
                    SaveToAlbum = true,
                    //Directory = "Sample",
                    //Name = "test.jpg"
                });


                if (file == null)
                    return;

                await DisplayAlert("File Location", file.Path, "OK");

                if (MyImage.Source == null)
                {
                    Console.WriteLine("MyImage.Source == null ==> OK");
                }

                MyImage.Source = ImageSource.FromStream(() =>
                {
                    var stream = file.GetStream();
                    file.Dispose();
                    return stream;
                });
            }
            else
            {
                await DisplayAlert("Permissions Denied", "Unable to take photos.", "OK");
            }

        }
        catch (Exception e)
        {
            Console.WriteLine("EXCEPTION HERE =: "+e);
        }
    }

【问题讨论】:

标签: android xamarin xamarin.forms montemagno-media.plugin


【解决方案1】:

我测试了你的代码,这个错误是由file_path.xml引起的

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_movies" path="Movies" />
<external-path name="my_images" path="Android/data/com.companyname.Pocidadao/files/Pictures" /> 
</paths>

如果我将 my_images 的路径更改为 &lt;external-files-path name="my_images" path="Pictures" /&gt;,你可以照常拍照了

这是我的演示。

https://github.com/851265601/TakePhotoDemo

这是我演示的 GIF。

【讨论】:

  • 如果回复有帮助,请不要忘记标记为答案(请点击答案右侧的“✔”)。它将帮助其他有类似问题的人。
  • 感谢您测试了我的代码。但我收到以下异常: EXCEPTION HERE =: System.ArgumentException: Unable to get file location。这很可能意味着您的 Android 清单文件中未设置文件提供程序信息。因为我是这样使用的:forums.xamarin.com/discussion/119942/…
【解决方案2】:

就我而言,我的清单中缺少这部分代码,请也检查一下。

<application android:label="XXX.Android" android:name="android.support.multidex.MultiDexApplication">
    <provider android:name="androidx.core.content.FileProvider"
      android:authorities="${applicationId}.fileprovider"
      android:exported="false"
      android:grantUriPermissions="true">
        <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
    </provider>
</application>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 2013-08-22
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多