Зарегистрировать новый тип файла в Android

Я хочу написать приложение для просмотра STL (файл геометрических данных) на Android, но я не могу распознать формат системы. То, что я написал в файле манифеста приложения:

<intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:pathPattern=".*\\.stl" /> <data android:mimeType="application/sla" /> <data android:host="*" /> </intent-filter> 

Но на данный момент я запускаю браузер и загружаю некоторый образец файла STL, загрузка прерывается, и мне сообщают, что тип файла данных неизвестен для системы. У меня нет реального устройства для Android, поэтому используйте только эмулятор, и для разработки я использую C # на MonoDroid (но я не думаю, что это проблема честно)

Любые идеи по теме?

Заранее спасибо.

Solutions Collecting From Web of "Зарегистрировать новый тип файла в Android"

Я использую этот манифест для регистрации (например) .stl-файла с моим приложением:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.test.core" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Testy" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ThorActivity" android:label="@string/app_name"> </activity> <activity android:name="LokiActivity" android:label="@string/app_name"> </activity> <activity android:name="OdinActivity" android:label="@string/app_name"> <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="http" android:host="*" android:pathPattern=".*\\.stl" /> <data android:scheme="https" android:host="*" android:pathPattern=".*\\.stl" /> <data android:scheme="content" android:host="*" android:pathPattern=".*\\.stl" /> <data android:scheme="file" android:host="*" android:pathPattern=".*\\.stl" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest> 

Как вы можете видеть, я связываю расширение файла .stl с активностью OdinActivity . Внутри OdinActivity я использую следующую строку, чтобы получить путь к файлу, чтобы я мог открыть его:

 filePath = getIntent().getData().getEncodedPath(); 

Затем я просто открываю его для чтения:

 FileOutputStream out = new FileOutputStream(new File(filePath)); 

Я удивлен, что решение gnclmorais должно работать. Поскольку у меня есть несколько записей data в одном intent-filter для меня это не сработало. В конце концов, в результате было создано несколько intent-filter :

 <activity android:description='@string/Activity_Description' android:icon='@drawable/ic_launcher' android:label='@string/Activity_Name' android:name='net.sourceforge.uiq3.fx603p.Calculator_Activity' > <intent-filter> <action android:name='android.intent.action.MAIN' ></action> <category android:name='android.intent.category.LAUNCHER' ></category> </intent-filter> <intent-filter android:icon='@drawable/ic_fx_603p_pf' android:label='FX-603P Simulator Program' android:priority='1' > <category android:name='android.intent.category.DEFAULT' ></category> <action android:name='android.intent.action.VIEW' ></action> <data android:host='*' android:pathPattern='.*\\.pf' android:scheme='file' ></data> </intent-filter> <intent-filter android:icon='@drawable/ic_fx_603p_df' android:label='FX-603P Simulator Datafile' android:priority='1' > <category android:name='android.intent.category.DEFAULT' ></category> <action android:name='android.intent.action.VIEW' ></action> <data android:host='*' android:pathPattern='.*\\.df' android:scheme='file' ></data> </intent-filter> <intent-filter android:icon='@drawable/ic_fx_603p_af' android:label='FX-603P Simulator Allfile (Data and Program)' android:priority='1' > <category android:name='android.intent.category.DEFAULT' ></category> <action android:name='android.intent.action.VIEW' ></action> <data android:host='*' android:pathPattern='.*\\.af' android:scheme='file' ></data> </intent-filter> <intent-filter android:icon='@drawable/ic_fx_603p_pf' android:label='FX-603P Simulator Program' android:priority='1' > <category android:name='android.intent.category.DEFAULT' ></category> <action android:name='android.intent.action.VIEW' ></action> <data android:host='*' android:mimeType='application/x-fx-602p.program' ></data> </intent-filter> <intent-filter android:icon='@drawable/ic_fx_603p_df' android:label='FX-603P Simulator Datafile' android:priority='1' > <category android:name='android.intent.category.DEFAULT' ></category> <action android:name='android.intent.action.VIEW' ></action> <data android:host='*' android:mimeType='application/x-fx-602p.data' ></data> </intent-filter> <intent-filter android:icon='@drawable/ic_fx_603p_af' android:label='FX-603P Simulator Allfile (Data and Program)' android:priority='1' > <category android:name='android.intent.category.DEFAULT' ></category> <action android:name='android.intent.action.VIEW' ></action> <data android:host='*' android:mimeType='application/x-fx-602p.all' ></data> </intent-filter> </activity> 

Обратите внимание, что использование обоих pathPattern и mimeType в одной записи data также не pathPattern . Не в последнюю очередь я бы предложил несколько нулевых проверок при получении имени файла:

  /** * <p>Open calculator and load file (if one was passed).</p> * @see android.app.Activity#onStart() */ @Override public void onStart () { android.util.Log.d (Calculator_Activity.TAG, "+ onStart"); super.onStart (); final android.content.Intent intent = getIntent (); if (intent != null) { android.util.Log.d (Calculator_Activity.TAG, "> Got intent : " + intent); final android.net.Uri data = intent.getData (); if (data != null) { android.util.Log.d (Calculator_Activity.TAG, "> Got data : " + data); final String filePath = data.getEncodedPath (); android.util.Log.d (Calculator_Activity.TAG, "> Open file : " + filePath); // file loading comes here. } // if } // if android.util.Log.d (Calculator_Activity.TAG, "- onStart"); return; } // onStart 

Фактическая загрузка файла отсутствует в образце. Он должен быть вставлен после команды журнала «Открыть файл».

Я пробовал другие решения, и это единственное, что работает для меня:

  <intent-filter android:icon="@drawable/icon" android:label="Armro File" android:priority="1" > <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:scheme="ftp" /> <data android:scheme="file" /> <data android:host="*" /> <data android:mimeType="*/*" /> <data android:pathPattern=".*\\.myowntype" /> </intent-filter> 

У кого-то есть идея, почему другие не работают?