![](/img/trans.png)
[英]VS Xamarin.Forms (Android): Camera and Storage access denied with Xam.Plugin.Media
[英]Xamarin Xam.Plugin.Media can't work out how to access camera
我正在嘗試創建一個可以訪問相機的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文件添加任何內容-它將顯示消息“照相機可用!”,因此該部分似乎工作正常。
但是,當我添加file_paths.xml文件時,我的應用程序在構建時崩潰。 我收到消息:
無效的資源目錄名稱:obj \\ Debug \\ res file_paths.xml“ res file_paths.xml”。 demoApp_Xamarin.Android C:\\ Users \\ Peter \\ Desktop \\ Skola \\ demoAppar \\ Xamarin \\ demoApp_Xamarin \\ demoApp_Xamarin \\ demoApp_Xamarin.Android \\ aapt.exe
文件file_paths.xml的文件路徑似乎不完整。 好像缺少了一個反斜杠。 (不過,我不知道如何解決它。即使這是實際的問題。)
我還收到以下錯誤消息:
找不到類型或名稱空間名稱“ App”(您是否缺少using指令或程序集引用?)
每當我創建一個名為file_paths.xml的文件時,無論放置在何處,都會出現第二條消息。
在Android中:
1> 內部清單 :
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:->
<?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>內部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)
{
}
});
}
}
我不確定,但是在您的android清單中,我認為您缺少file_path文件的@,因為您正在“鏈接”到資源文件。
它應該是
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@file_paths"></meta-data>
我的file_paths文件位於名為“ xml”的文件夾中,我的代碼為
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
這是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.