Как добавить пользовательский тип mime?
Что мне нужно:. Чтобы отправлять свой файл по почте и импортировать его с помощью моего приложения из кнопки предварительного просмотра в GMail или при открытии его в браузере файлов.
Что я знаю: Я прочитал много настраиваемых обработчиков типов mime, что андроид не заботится о расширении файла и т.д., но как создать тип mime для моего настраиваемого файла?
Вопрос: Должен ли я быть поставщиком контента? Я просто хочу импортировать файлы (из резервной копии), не предоставляя ничего. Я видел людей, у которых есть обработчики для "application/abc", говорящие, что он работает нормально, но как добавить это соединение для моего файла "myFile.abc" и типа mime?
Будет указано какое-то направление, как регистрировать/отображать пользовательские типы mime!:)
Ответы
Ответ 1
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:host="{your mime}.com"
android:scheme="http" >
</data>
</intent-filter>
</activity>
<!--
android:scheme="http" will make android "think" thats this is a link
-->
Теперь, когда вы получаете sms с текстом "http://{your mime}.com"
или кликаете ссылку в Интернете с этим текстом, ваша активность (MainActivity) будет запущена.
Вы также можете добавить параметры:
text = "http://{your mime}.com/?number=111";
Затем в методах onCreate() или onResume() вы добавите:
Intent intentURI = getIntent();
Uri uri = null;
String receivedNum = "";
Log.d("TAG", "intent= "+intentURI);
if (Intent.ACTION_VIEW.equals(intentURI.getAction())) {
if (intentURI!=null){
uri = intentURI.getData();
Log.d("TAG", "uri= "+uri);
}
if (uri!=null)
receivedNum = uri.getQueryParameter("number");
}
Ответ 2
Насколько я могу судить, типы mime довольно гибкие (я создал мой как application/whatever
), и они сразу же принимаются Android, еще в версии Dalvik 2.1. Чтобы обработать их правильно, я добавил этот фильтр-замысел:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/whatever" />
</intent-filter>
Однако есть предостережение. Несмотря на то, что я всегда задавал тип отправки Intent с помощью intent.setType("application/whatever");
, на некоторых телефонах я видел фактические данные о прибытии как application/octet
(чтобы увидеть значение, я назначил входящее намерение и сразу проверил его значение Intent currentIntent = getIntent();
). Получающее устройство Android не знало, что делать с входящими данными, и сказал мне об этом. Поэтому я добавил
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/octet-stream" />
</intent-filter>
Конечно, этот подход может быть неприятным, но проблема с Gmail по крайней мере заключается в том, что он не обязательно записывает файл с именем, как он есть, что делает любой путь, который я выбираю, определять бесполезно. И, по крайней мере, с входящим octet-stream
вы знаете, что не какие-либо конкретные данные приложения, которые вы крадете... Тем не менее, вы должны проверить данные после этого, а не просто считать его действительным для своего приложения.
Ответ 3
Неподтвержденный, но что-то вроде этого должно работать. Поместите его в свой AndroidManifest.xml с активностью, которую вы хотите открыть.
<activity name=".ActivityHere">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:mimeType="mimeTypeHere" />
</intent-filter>
</activity>
Ответ 4
Зарегистрируйте собственный тип mime с помощью android.webkit.MimeTypeMap