Я настроил фильтр намерений, который будет запускаться, когда пользователь загружает файл с определенным типом MIME во встроенном браузере, мое приложение открывается для его обработки. Затем я получаю URI в поле Intent getData(), которое можно использовать для получения данных. Это кажется странным, так как для получения MIME-типа браузер, очевидно, уже по крайней мере запустил HTTP-запрос, но в случае простого HTTP GET это не имеет большого значения — в этом случае я просто повторно извлекаю его и все. Это хорошо.
Однако, если желаемый контент появляется в результате публикации формы, мне не повезло - и я, кажется, не единственный, но я не могу найти никаких ответов. Вот пара людей, задающих похожие вопросы без ответа, и тикет Google, который, по-видимому, указывает на то, что это было жестким ограничением в более старых версиях, но было исправлено в Android 4.0 / Ice Cream Sandwich (который я использую):
Получение данных из неявного намерения
Обработка типа MIME, который является результат POST браузера в Android
http://code.google.com/p/android/issues/detail?id=1780
Вот фильтр намерений, который я использую:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT"/>
<action android:name="android.intent.action.RUN"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.WEB_SEARCH" />
<category android:name="android.intent.category.ALTERNATIVE"/>
<data android:host="*"/>
<data android:mimeType="application/my-content-type"/>
<data android:scheme="file"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
</intent-filter>
Намерение, которое я возвращаю, не содержит никаких дополнений (getExtras() == null), схема — http (или https, в зависимости от ситуации), mimeType — «application/my-content-type», а данные — это просто URL-адрес, который был Размещено в.
Я пытался использовать getContentResolver().query([theURI], null, null, null, null)
моей активности, но это возвращает ноль; Я также пробовал getContentResolver().acquireContentProviderClient([theURI])
, но это тоже возвращает ноль.
Я также пытался использовать getContentResolver().getInputStream([theURI])
, но это выдает следующее:
java.io.FileNotFoundException: No content provider: http://[the form URL] at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:603) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:535) at android.content.ContentResolver.openInputStream(ContentResolver.java:370) at my.package.MyActivity.onStart(MyActivity.java:127) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133) at android.app.Activity.performStart(Activity.java:4475) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) at android.app.ActivityThread.access$600(ActivityThread.java:122) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4340) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method)
Итак, я просто что-то упустил, или это просто ограничение фреймворка?
Спасибо.