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

Зарегистрировать новый тип файла в 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-устройства, поэтому я использую только эмулятор, а для разработки я использую С# на MonoDroid (но я, честно говоря, не думаю, что это проблема).

Как я мог решить эту проблему?

4b9b3361

Ответ 1

Я использую этот манифест для регистрации (например) типа файла .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));

Ответ 2

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

<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 также не работает. Наконец, что не менее важно, я бы предложил несколько нулевых проверок при получении имени файла:

   /**
    * <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

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

Ответ 3

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

<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>

Почему другие не работают?

Ответ 4

Поместите этот фильтр намерений в действие, которое вы хотите открыть, касаясь файла:

<intent-filter android:priority="999">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.OPENABLE" />

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>

Ответ 5

Попробуйте распознать формат следующим образом:

<intent-filter android:priority="999">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.OPENABLE" />

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>