Подтвердить что ты не робот

Как добавить пользовательский тип mime?

Что мне нужно:. Чтобы отправлять свой файл по почте и импортировать его с помощью моего приложения из кнопки предварительного просмотра в GMail или при открытии его в браузере файлов.

Что я знаю: Я прочитал много настраиваемых обработчиков типов mime, что андроид не заботится о расширении файла и т.д., но как создать тип mime для моего настраиваемого файла?

Вопрос: Должен ли я быть поставщиком контента? Я просто хочу импортировать файлы (из резервной копии), не предоставляя ничего. Я видел людей, у которых есть обработчики для "application/abc", говорящие, что он работает нормально, но как добавить это соединение для моего файла "myFile.abc" и типа mime?

Будет указано какое-то направление, как регистрировать/отображать пользовательские типы mime!:)

4b9b3361

Ответ 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