Android: перехватывать HTTP-ответ формы POST с помощью фильтра намерений ACTION_VIEW - PullRequest
2 голосов
/ 21 марта 2012

Я настроил фильтр намерений, который будет запускаться, когда пользователь загружает файл с определенным 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)

Итак - я что-то упускаю или это просто ограничение фреймворка?

Спасибо.

...