web-dev-qa-db-ja.com

Android)に新しいファイルタイプを登録します

Androidで簡単なSTL(幾何学的データファイル)ビューアアプリケーションを作成したいのですが、システムにフォーマットを認識させることができません。これをアプリのマニフェストファイルに書き込みました。

<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でC#を使用します(ただし、正直言ってそれが問題だとは思いません)。

どうすればこの問題を解決できますか?

21
Tigran

このマニフェストを使用して、(たとえば).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));
23
gnclmorais

gnclmoraisのソリューション が機能するはずだと驚いています。 1つのintent-filterに複数のdataエントリがあるため、私にはうまくいきませんでした。最終的に機能したのは、1つのactivityに複数の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>

1つのpathPatternエントリにmimeTypedataの両方を含めることも機能しないことに注意してください。最後になりましたが、ファイル名を取得するときに、いくつかのnullチェックをお勧めします。

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

ファイルの実際のロードがサンプルから欠落しています。 「ファイルを開く」ログコマンドの後に挿入する必要があります。

6
Martin

私は他の解決策を試しました、そしてこれは私のために働く唯一のものです:

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

なぜ他のものが機能しないのですか?

6
Simon

次のように形式を認識してみてください。

<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>
1
Ráfagan