我如何从URI打开位图,这是拍摄相机图片的结果



我在这里很困惑,并且尝试了许多我见过的建议。我正在关注Xamarin食谱,以访问Android上的相机并拍照。有些事情过时/过时,但是无论我要拨打BitmapFactory.DecodeFile,所以我可以打开用户刚刚拍摄的图像并调整它以在我视图中显示的图像。我遇到的问题是我不能使用文件路径,我必须使用uris。所以我遵循了这个线程中的说明

并设置我的文件提供商的内容。我的资源/XML目录中有此文件:provider_paths.xml(MyApp从我的实际应用详细信息中重命名(

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="MyApp" path="."/>
</paths>

然后在清单中添加了此部分:

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

我确保目录存在:

var file = new File(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures), "MyApp");
Directory = file.AbsolutePath;
if (!file.Exists())
    file.Mkdirs();

(目录是字符串变量(。

我创建意图和文件名称:

Intent intent = new Intent(MediaStore.ActionImageCapture);              
var file = new File(Directory, $"myPhoto_{Guid.NewGuid()}.jpg");
BaseFilename = file.Name;
_uri = FileProvider.GetUriForFile(MainActivity.Instance, "com.myapp.provider", file);
intent.PutExtra(MediaStore.ExtraOutput, _uri);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);

(basefilename是此类中的字符串变量(

首先,我认为也许我应该以某种方式将URI转换为文件路径,以便可以调用bitmapfactory.decodefile。我遵循了几个线程,它们都没有用。当他们都开始进行contentResolver.query或光标操作时,我得到了各种例外。

所以我想,好吧,有一个bitmapfactory.decodestream方法,为什么不使用它呢?我尝试从URI获取流,这样:

var stream = MainActivity.Instance.ContentResolver.OpenInputStream(_uri)

但是当我这样做时,我会得到一个例外: Java.Lang.Exception: open failed: ENOENT (No such file or directory)

我尝试此尝试时的uri是什么样子:

content://com.myapp.provider/MyApp/Pictures/MyApp/myPhoto_2d13056f-6d23-461a-ad4b-532e10d9cb75.jpg

在这一点上,我很困惑,即使是问题是什么,并且很难与大量过时的Xamarin样本相处,我不知道在哪里看,甚至在这里还有什么真正的潜在问题。任何洞察力都将不胜感激。顺便说一句,如果它很重要,我至少可以正确使用权限。我已经提示了相机和存储访问(我已经处理了有关未经摄像机/读/写外部存储许可的错误,所以至少已经结束了(。

omg,我只是在将头撞到墙上的两天后才弄清楚。事实证明,小睡实际上很有帮助。我以为我已经收到了所有的许可请求。但是后来我开始探索设备的文件结构,并注意到没有保存图像。这真的很奇怪,因为昨晚图像实际上是在节省。我可以看到它们和日期邮票。无论如何,我决定尝试提示WRITE_EXTERNAL_STORAGE许可(已经使用Read和Camera进行了此操作(,并解决了所有问题。

最新更新