Xamarin 表单无法获取文件位置
Xamarin forms Unable to unable to to get file location
我必须打开相机拍照,但无法正常工作。我搜索了类似的帖子,但我无法弄清楚。有什么建议吗?
清单
<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="@xml/file_paths"></meta-data>
</provider>
file_paths
<external-files-path name="my_images" path="Pictures" />
<external-files-path name="my_movies" path="Movies" />
<external-path name="my_images" path="Android/data/com.plugin.mediatest/files/Pictures" />
代码
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsTakePhotoSupported && !CrossMedia.Current.IsPickPhotoSupported)
{
await DisplayAlert("Message", "Unavailable", "OK");
return;
}
else
{
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
Directory = "Images",
Name = DateTime.Now +".jpg",
SaveToAlbum = false
});
await DisplayAlert("FilePath", file.Path, "OK");
PhotoImage.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
你可以在GitHub上参考这篇Usage , and there is a sample。
takePhoto.Clicked += async (sender, args) =>
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
DisplayAlert("No Camera", ":( No camera available.", "OK");
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Directory = "Sample",
Name = "test.jpg"
});
if (file == null)
return;
await DisplayAlert("File Location", file.Path, "OK");
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
};
关于 Android Misc Setup ,
默认情况下,该库将 android.hardware.camera
和 android.hardware.camera.autofocus
作为可选功能添加到您的应用清单中。您有责任在使用前检查您的设备是否支持该硬件。相反,如果您希望 Google Play 过滤掉没有所需硬件的设备,请将以下内容添加到 Android 项目的 AssemblyInfo.cs 文件中:
[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]
您还必须添加一些额外的配置文件以遵守新的严格模式:
1.) 将以下内容添加到您的 AndroidManifest.xml
标签内:
<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="@xml/file_paths"></meta-data>
</provider>
2.) 添加一个名为 xml 的新文件夹到您的 Resources 文件夹中,并添加一个名为 file_paths.xml
的新 XML 文件。确保此 XML 文件的构建操作为:AndroidResource
.
添加以下代码:
<?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>
最终效果:
==================================更新======== ===========================
检查共享示例后,有两个问题。
首先,你最好把Solution的Nuget Package(Xamarin Forms 3.1
)更新到最新版本(Xamarin Forms 4.3
).
其次 , 你忘记添加 Provider 到 AndroidManifest.xml
:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.fileprovider.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/files_paths"></meta-data>
</provider>
注意:provider里面的部分参数(android:resource
)需要修改成你在项目中自定义的名字(@xml/files_paths
)。你命名它不是 @xml/file_paths
,那么它找不到提供者 .
示例效果:
我必须打开相机拍照,但无法正常工作。我搜索了类似的帖子,但我无法弄清楚。有什么建议吗?
清单
<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="@xml/file_paths"></meta-data>
</provider>
file_paths
<external-files-path name="my_images" path="Pictures" />
<external-files-path name="my_movies" path="Movies" />
<external-path name="my_images" path="Android/data/com.plugin.mediatest/files/Pictures" />
代码
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsTakePhotoSupported && !CrossMedia.Current.IsPickPhotoSupported)
{
await DisplayAlert("Message", "Unavailable", "OK");
return;
}
else
{
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
{
Directory = "Images",
Name = DateTime.Now +".jpg",
SaveToAlbum = false
});
await DisplayAlert("FilePath", file.Path, "OK");
PhotoImage.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
你可以在GitHub上参考这篇Usage , and there is a sample。
takePhoto.Clicked += async (sender, args) =>
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
DisplayAlert("No Camera", ":( No camera available.", "OK");
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Directory = "Sample",
Name = "test.jpg"
});
if (file == null)
return;
await DisplayAlert("File Location", file.Path, "OK");
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
};
关于 Android Misc Setup ,
默认情况下,该库将 android.hardware.camera
和 android.hardware.camera.autofocus
作为可选功能添加到您的应用清单中。您有责任在使用前检查您的设备是否支持该硬件。相反,如果您希望 Google Play 过滤掉没有所需硬件的设备,请将以下内容添加到 Android 项目的 AssemblyInfo.cs 文件中:
[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]
您还必须添加一些额外的配置文件以遵守新的严格模式:
1.) 将以下内容添加到您的 AndroidManifest.xml
标签内:
<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="@xml/file_paths"></meta-data>
</provider>
2.) 添加一个名为 xml 的新文件夹到您的 Resources 文件夹中,并添加一个名为 file_paths.xml
的新 XML 文件。确保此 XML 文件的构建操作为:AndroidResource
.
添加以下代码:
<?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>
最终效果:
==================================更新======== ===========================
检查共享示例后,有两个问题。
首先,你最好把Solution的Nuget Package(Xamarin Forms 3.1
)更新到最新版本(Xamarin Forms 4.3
).
其次 , 你忘记添加 Provider 到 AndroidManifest.xml
:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.fileprovider.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/files_paths"></meta-data>
</provider>
注意:provider里面的部分参数(android:resource
)需要修改成你在项目中自定义的名字(@xml/files_paths
)。你命名它不是 @xml/file_paths
,那么它找不到提供者 .
示例效果: