C# Xamarin/Android-问题:从相机读取本地存储的照片-无读取权限

C# Xamarin/Android-问题:从相机读取本地存储的照片-无读取权限,c#,java,android,mono,xamarin,C#,Java,Android,Mono,Xamarin,我正在尝试创建一个简单的测试应用程序,使用Xamarin在Android上拍照。我希望,当我让这个应用程序运行时,我会在我正在开发的真实应用程序中使用代码。我使用Xamarin的以下配方作为基础: 主要区别在于我需要本地存储图像,而不是存储在SD卡上。我能够成功地用Android模拟器拍摄照片。我可以使用ADB在文件结构中查看该文件,并可以在我的电脑上成功复制和打开该文件。但是,我无法在应用程序中访问该文件,可能是由于用户权限 请注意,我成功地创建了自己的.txt文件,并使用System.IO和

我正在尝试创建一个简单的测试应用程序,使用Xamarin在Android上拍照。我希望,当我让这个应用程序运行时,我会在我正在开发的真实应用程序中使用代码。我使用Xamarin的以下配方作为基础:

主要区别在于我需要本地存储图像,而不是存储在SD卡上。我能够成功地用Android模拟器拍摄照片。我可以使用ADB在文件结构中查看该文件,并可以在我的电脑上成功复制和打开该文件。但是,我无法在应用程序中访问该文件,可能是由于用户权限

请注意,我成功地创建了自己的.txt文件,并使用System.IO和Java.IO将它们读回

请检查以下代码。我的应用程序在使用System.IO.File.ReadAllText时崩溃,我无法访问路径/data/data/CameraAppDemo.CameraAppDemo/files/photo.jpg。。无论我尝试什么绝对路径、相对路径、uri,objBitmap总是空的

亚洲开发银行表示photo.jpg拥有-rwxrwx-权限,尽管我不能完全确定,但我认为这应该足够了

另一方面,可能意图仍然锁定photo.jpg?或者其他什么事情正在发生

最后一点,我使用System.IO.File.ReadAllText只是为了测试。我也尝试了流阅读器,但结果是一样的。此外,尽管我认为这一步是不必要的,但我在清单中启用了WriteExternalStore

namespace CameraAppDemo
{
        using System;
        using System.Collections.Generic;

        using Android.App;
        using Android.Content;
        using Android.Content.PM;
        using Android.Graphics;
        using Android.OS;
        using Android.Provider;
        using Android.Widget;

        using Java.IO;

        using Environment = Android.OS.Environment;
        using Uri = Android.Net.Uri;

        [Activity(Label = "Camera App Demo", MainLauncher = true)]
        public class MainActivity : Activity
        {
                private File _file;
                private string _basePath;
                private ImageView _imageView;

                protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
                {
                        base.OnActivityResult(requestCode, resultCode, data);

                        var objBitmap = BitmapFactory.DecodeFile(_file.AbsolutePath) ;
                        Console.WriteLine ("objBitmap = null : " + (objBitmap == null).ToString ());

                        var strOutput = System.IO.File.ReadAllText (FileManager.BasePath + "/photo.jpg");
                        Console.WriteLine (strOutput);
                }

                protected override void OnCreate(Bundle bundle)
                {
                        base.OnCreate(bundle);
                        SetContentView(Resource.Layout.Main);

                        FileManager.SetupFolderStructure();

                        if (IsThereAnAppToTakePictures())
                        {
                                Button button = FindViewById<Button>(Resource.Id.myButton);
                                _imageView = FindViewById<ImageView>(Resource.Id.imageView1);

                                button.Click += TakeAPicture;
                        }
                }

                private bool IsThereAnAppToTakePictures()
                {
                        Intent intent = new Intent(MediaStore.ActionImageCapture);
                        IList<ResolveInfo> availableActivities = PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);

                        return availableActivities != null && availableActivities.Count > 0;
                }

                private void TakeAPicture(object sender, EventArgs eventArgs)
                {
                        System.IO.Directory.Delete (FileManager.BasePath, true);
                        _basePath = FileManager.BasePath;

                        _file = new Java.IO.File (_basePath, "photo.jpg");

                        Intent intent = new Intent(MediaStore.ActionImageCapture);
                        intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(_file));
                        StartActivityForResult(intent, 0);
                }
        }
}

//Part of the FileManager class:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Android.Graphics;

namespace CameraAppDemo
{
        public class FileManager
        {
                public static string BasePath {
                        get { 
                                var libraryPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); 

                                if (Directory.Exists (libraryPath) == false) {
                                        Directory.CreateDirectory (libraryPath);
                                }

                                return libraryPath;
                        }
                }
     }
}
这两种情况都返回False。我无法读取该文件,并且无法授予读取权限

有什么想法吗?这是故意的吗?我可以说出拍摄图像的目的,以使我具有阅读权限,还是有其他解决方法


如果一切都失败了,我希望通过先保存到SD卡,然后将文件复制到本地文件系统来解决这个问题。但这是我不愿做的事;我不能保证最终用户有SD卡,图片不应该被意外删除。

你能把你的解决方案上传到某个地方吗?我可以看一看:谢谢你!虽然我不确定事情的工作方式,但我现在有了一个理论,即相机的意图,即内置相机应用程序成为照片的所有者,而不是测试应用程序本身,这就是测试应用程序无法访问照片的原因。我认为创建内容提供商可能是正确的做法,但我在解决方案的第二个项目中都没有成功。我的代码如下:我使用相同的xamarin示例尝试拍摄一张照片,然后在应用程序中显示它。我的问题是拍完照片并批准后。应用程序从不调用ActivityResult。
Console.WriteLine("Setting file :" + _file.SetReadable (true));
Console.WriteLine("Can read :" + _file.CanRead());