我正在尝试创建一个可以访问相机的Xamarin应用程序(我不需要存储任何拍摄的照片或任何东西,只需要能够通过按钮点击启动相机。)我正在使用用于测试应用的Android设备。
我安装了Xam.Plugin.Media插件。我将以下内容添加到AndroidManifest中的application-tag:
<provider android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="file_paths"></meta-data>
</provider>
我在Android项目中创建了一个名为xml的资源的新文件夹。我在xml文件夹中创建了一个名为file_paths.xml的新文件,并将以下内容放在该文件中:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="Pictures" />
<external-files-path name="my_movies" path="Movies" />
</paths>
最后我将此代码添加到我的MainPage.xaml.cs文件中:
public void CameraClicked(object sender, EventArgs e) {
testAsync();
}
async void testAsync() {
await CrossMedia.Current.Initialize();
if (CrossMedia.Current.IsCameraAvailable && CrossMedia.Current.IsTakePhotoSupported) {
await DisplayAlert("Alert", "Camera available!", "OK");
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions {
Directory = "Sample",
Name = "test.jpg"
});
}
else {
await DisplayAlert("Alert", "Camera unavailable!", ":(");
}
}
如果我运行上面的代码 - 没有向清单或xml文件添加任何内容 - 它将显示消息&#34;相机可用!&#34;,因此该部分似乎工作正常。
但是,当我添加file_paths.xml文件时,我的应用程序在构建时崩溃了。我收到了消息:
无效的资源目录名称:obj \ Debug \ res file_paths.xml&#34; res file_paths.xml&#34;。 demoApp_Xamarin.Android C:\ Users \ Peter \ Desktop \ Skola \ demoAppar \ Xamarin \ demoApp_Xamarin \ demoApp_Xamarin \ demoApp_Xamarin.Android \ aapt.exe
似乎文件file_paths.xml的文件路径不完整。好像没有反斜杠了。 (但我不知道如何修复它。或者即使这是实际问题。)
我还收到以下错误消息:
类型或命名空间名称&#39;应用程序&#39;找不到(你错过了使用指令或汇编引用吗?)
每当我创建一个名为file_paths.xml的文件时,无论我把它放在何处,都会出现第二条消息。
答案 0 :(得分:0)
在Android中:
1&gt; 清单:
a)首先添加权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
b)在应用程序标记内创建提供程序:
<application android:label="Application Name" android:icon="@drawable/appIcon" android:largeHeap="true"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="applicationPackageName.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> </application>
c)在资源目录中创建xml文件夹: 在xml里面:: 创建file_paths.xml: - &gt;
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="my_images" path="Pictures" /> <external-files-path name="my_movies" path="Movies" /></paths>
2&gt;在ViewModel内部:
public ICommand _capturePhoto;
public ICommand CapturePhoto
{
get
{
return _capturePhoto ?? new Command(async () =>
{
try
{
if (!CapturePhoto.CanExecute(null)) return;
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
SaveToAlbum = true,
CompressionQuality = 75,
CustomPhotoSize = 50,
PhotoSize = PhotoSize.MaxWidthHeight,
MaxWidthHeight = 2000
});
if (file == null)
return;
var fileExtension = MimeTypeMap.GetFileExtensionFromUrl(file.Path);
AddAttachmentToCollection(file.Path, DocumentType.Photo,fileExtension);
file.Dispose();
}
catch (Exception ex)
{
}
});
}
}
答案 1 :(得分:0)
我不完全确定但是在你的Android清单中我认为你错过了一个@的file_path文件,因为你是&#34;链接&#34;到资源文件。
应该是
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@file_paths"></meta-data>
我的file_paths文件位于名为&#34; xml&#34;的文件夹中。我的代码是
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
这是有效的。