web-dev-qa-db-ja.com

Xamarin Forms File Providerが設定されていません

現在、Xamarin.Formsの学習プロセスを行っています。現在、Plugin.Media.CrossMediaライブラリを使用してカメラ機能を実装しようとしています。

以下に実装:

public async Task<ImageSource> StartCamera()
{
    await CrossMedia.Current.Initialize();


    if (Plugin.Media.CrossMedia.Current.IsTakePhotoSupported && CrossMedia.Current.IsCameraAvailable)
    {
            var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions() { SaveToAlbum=false, SaveMetaData=false});

            if (photo != null)
                return ImageSource.FromStream(() => { return photo.GetStream(); });
            else
                return null;



    }
    else
    {
        return null;
    }
}

ただし、「TakePhotoAsync」メソッドを実行すると、次のエラーが発生します。

System.ArgumentException: Unable to get file location. This most likely means that the file provider information is not set in your Android Manifest file. Please check documentation on how to set this up in your project.

これを調べてみましたが、役に立ちませんでした。現在、AndroidManifest.xmlファイルは次のようになっています。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" package="RCPTTracker.Android" Android:versionCode="1" Android:versionName="1.0">
    <uses-sdk />
    <application Android:label="RCPTTracker.Android"></application>
</manifest>

私の考えでは、ここで何かを宣言する必要がありますが、何を見つけることができず、私が従ったすべてのチュートリアルは、ファイルプロバイダーの設定については何も行いません。

助言がありますか?

11
Duncan Palmer

READMEによると:

アプリケーションがAndroid N(API 24)以降を対象とする場合、バージョン2.6.0+を使用する必要があります。

また、新しい厳密モードに準拠するために、いくつかの構成ファイルを追加する必要があります。

1.)AndroidManifest.xmlのタグ内に次を追加します。

<provider Android:name="Android.support.v4.content.FileProvider" 
                Android:authorities="YOUR_APP_PACKAGE_NAME.fileprovider" 
                Android:exported="false" 
                Android:grantUriPermissions="true">
                <meta-data Android:name="Android.support.FILE_PROVIDER_PATHS" 
                Android:resource="@xml/file_paths"></meta-data>
</provider>

YOUR_APP_PACKAGE_NAMEはアプリのパッケージ名に設定する必要があります!

2.)xmlという新しいフォルダーをResourcesフォルダーに追加し、file_paths.xmlという新しい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>

YOUR_APP_PACKAGE_NAMEはアプリのパッケージ名に設定する必要があります!

詳細については、 https://developer.Android.com/training/camera/photobasics.html をご覧ください。

14
Marco

私の場合、AndroidManifest.xmlファイルの間違った場所にFileProviderを置いていたからです。 <Application>タグ内にある必要がありました。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:versionCode="1" Android:versionName="1.0" package="com.myapp.app1" Android:installLocation="auto">
        <uses-sdk Android:minSdkVersion="22" Android:targetSdkVersion="27" />
        <uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission Android:name="Android.permission.ACCESS_SURFACE_FLINGER" />
        <uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
        <uses-permission Android:name="Android.permission.BROADCAST_WAP_Push" />
        <uses-permission Android:name="Android.permission.CAMERA" />
        <uses-permission Android:name="Android.permission.INTERNET" />
        <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission Android:name="Android.permission.RECEIVE_WAP_Push" />
        <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
        <uses-permission Android:name="Android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <uses-permission Android:name="Android.permission.ACCESS_MOCK_LOCATION" />
        <application Android:label="app1.Android">
            <meta-data Android:name="com.google.Android.maps.v2.API_KEY" Android:value="AIzaSyCZF1O9_7-MXlxYfAEIxBQkr-dR8RiwiYE" />

            <!-- ADD FILE PROVIDER HERE -->
            <provider Android:name="Android.support.v4.content.FileProvider"
                  Android:authorities="com.myapp.app1.fileprovider"
                  Android:exported="false"
                  Android:grantUriPermissions="true">
              <meta-data Android:name="Android.support.FILE_PROVIDER_PATHS"
              Android:resource="@xml/file_paths"></meta-data>
            </provider>

        </application>
    </manifest>
7
Noobie3001

私が抱えていた問題は、大文字と小文字の区別に関連していました。

下の行

<provider Android:name="Android.support.v4.content.FileProvider"
          Android:authorities="com.myexample.myapp.fileProvider"
          Android:exported="false"
          Android:grantUriPermissions="true">

誤ってAndroid:authorities="com.myexample.myapp.fileProvider"行に大文字が1つありました。そのはず:

Android:authorities="com.myexample.myapp.fileprovider"  <!-- all lowercase -->

または

Android:authorities="${applicationId}.fileprovider"    

Android:authoritiesのパッケージ名と値は小文字にする必要があります。そうしないと、エラーが発生します。

System.ArgumentException:ファイルの場所を取得できません。これはおそらく、ファイルプロバイダー情報がAndroidマニフェストファイルに設定されていないことを意味します。プロジェクトでこれを設定する方法に関するドキュメントを確認してください。

2
haldo

最新バージョンでは、正しい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>

以下のようにパッケージ名を組み合わせてパスを設定した場合

<external-path name="my_images" path="Android/data/YOUR_APP_PACKAGE_NAME/files/Pictures" />

このタイプのエラーが発生する場合があります。

0
dush88c