19

Android N 用のコンパイル の問題に直面しましたFileProvider。ユーザーがギャラリーから画像を選択したり、カメラで写真を撮ったりしてから、正方形にトリミングできるようにする必要があります。

カメラで画像を撮るための実装はできましたがFileProvider、ギャラリーからの画像の選択に深刻な問題があります。問題は、ギャラリーにさまざまな場所からのファイルがたくさんあり、たとえば次のような例外があることです。

  java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/6133-3766/DCIM/100ANDRO/DSC_0035.JPG

問題は、file_paths.xmlに何を入力して、.xml 内のどこにでもアクセスできるようにすること/storage/です。WhatsAppや同様のアプリからの写真がある可能性があるため、正確なパスに頼ることはできません。たとえば、WhatsApp画像は次のパスを取得します。

/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20160821-WA0000.jpg

空のパスで解決できました:

<external-path name="external_storage" path=""/>

Environment.getExternalStorageDirectory()これは、ドキュメントによると似ています。

しかし、に保存されている画像を処理する方法はまだわかりません/storage/SOME_DIR/。助けてください。

4

2 に答える 2

5

この質問は誤解に基づいていると思います。

FileProviderの目的は、アプリが既に制御しているファイルへの (外部アプリへの) アクセスを許可することです。

独自のファイル プロバイダーを使用して、外部アプリが所有するファイルにアクセスすることに成功することはありません。

ファイルプロバイダーを使用してそのアクセスを許可するかどうかは、外部アプリ次第です。

それが質問が求めているもののようです。私があなたの質問を理解していない場合はお知らせください。ただし、理解できたとしても、あなたがやろうとしていることはうまくいきません。

于 2016-09-12T14:26:21.597 に答える
4

@x-codeの回答に同意しましたが、問題についてあまり明確に説明されていませんが、別のアプリの内部データにアクセスしようとする場合は、アクセス許可が必要です。

アプリに正当に属し、ユーザーがアプリをアンインストールするときに削除する必要があるファイル。これらのファイルは外部ストレージ上にあるため、技術的にはユーザーや他のアプリからアクセスできますが、現実的にはアプリ外のユーザーに価値を提供しないファイルです。

実際、SDKバージョン24が多くのスキームで更新され、ファイルの操作に大幅な変更があることをドキュメントで発見しました。ドキュメントから、file://の問題は次のように説明されています..

パッケージ ドメインの外部で file:// URI を渡すと、受信者がアクセスできないパスを残す可能性があります。したがって、file:// URI を渡そうとすると、FileUriExposedException がトリガーされます。プライベート ファイルのコンテンツを共有するための推奨される方法は、FileProvider を使用することです。

セキュリティ上の理由から、 file:// の代わりに Content:// を使用することを強くお勧めします。そのため、基本的には FileProvider の代わりに ContentProvider を使用します。

それを使用する簡単な例は以下のとおりです。

AndroidMenifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    <application
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
    </application>
</manifest> 

_paths.xml次に、フォルダーの下の xml フォルダーにプロバイダー ファイルを作成しresます。フォルダーが存在しない場合は、作成する必要がある場合があります。

ファイルの内容を以下に示します。(path=".")という名前のルート フォルダにある外部ストレージへのアクセスを共有したいと説明していますexternal_files

res/xml/provider_paths.xml

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

今、それを使用するために、

Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
        BuildConfig.APPLICATION_ID + ".provider",
        createImageFile());

これはこのブログから引用したものなので、完全に理解するために読んでください。

于 2016-09-12T14:46:13.943 に答える