Android 4.4のストレージアクセスフレームワークを試してみました
アクティビティの開始時にインテントを起動するダミーアプリを開発しました。
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, READ_REQUEST_CODE);
また、ファイルプロバイダーとして機能する別のダミーアプリを開発しました。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.saf"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk
Android:minSdkVersion="19"
Android:targetSdkVersion="19" />
<uses-permission Android:name="Android.permission.MANAGE_DOCUMENTS"/>
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name="com.example.saf.MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
Android:name="com.example.saf.MyFileProvider"
Android:authorities="com.example.saf.documents"
Android:exported="@bool/is_KitKat"
Android:enabled="@bool/is_KitKat"
Android:grantUriPermissions="@bool/is_KitKat"
Android:permission="Android.permission.MANAGE_DOCUMENTS">
<intent-filter>
<action Android:name="Android.content.action.DOCUMENTS_PROVIDER" />
</intent-filter>
</provider>
</application>
MyFileProviderクラスを実装しました。
しかし、ユーザーアプリ(インテントを起動するアプリ)を起動すると、次のエラーが発生します
Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=Android.intent.action.OPEN_DOCUMENT cat=[Android.intent.category.OPENABLE] }
私はAndroidの開発者向けドキュメントをフォローしていました。私が間違っているかもしれないアイデアはありますか?
編集:これが私の最新のマニフェストです。また、MyFileProvider「extendsDocumentsProvider」の「適切な」実装が必要ですか?今のところ、関数でnullを返すことはできますか?
Mimeタイプを追加するか、単にintent.setType("*/*")
を追加します。
これは 既知の問題 のようです。 setType()
が必要です。
編集:Android:enabled="true"
も追加する必要があります。> = KitKatに対してのみ有効にするために、直接ではなく値から参照する必要があることに注意してください。したがって、Android:enabled="@bool/is_KitKat"
の<bool name="atLeastKitKat">false</bool>
、/res/values/
、および<bool name="atLeastKitKat">true</bool>
の/res/values-v19/
すべてのファイルを開くには、次の行を追加します。
intent.setType("*/*") ;
画像を表示するためにフィルタリングする必要がある場合は、次の行を追加します。
intent.setType("image/*");
次のように、意図をキャストするだけです。
Intent intent = new Intent("Android.intent.action.GET_CONTENT");
((Intent)intent).addCategory("Android.intent.category.OPENABLE");
((Intent)intent).setType("*/*");