2011-01-25 94 views
19

我想在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(但我不認爲這是老生常談)

任何想法的主題?

預先感謝您。

+0

我只是猜測,但你可以嘗試省略主機元素。另外,logcat可能會告訴你什麼樣的模式是'進來',以便您更好地瞭解系統正在尋找什麼。 – 2011-01-26 21:14:24

回答

21

我使用這個清單進行註冊(例如)·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)); 
+0

hm ..我試過把.mmmm格式改成已知的格式(我用的是PDF)。轉到我的GMail帳戶,並嘗試從我擁有的郵件之一下載DPF。我得到了完全相同的負面結果。所以我有一些疑問:我是否需要實現我的自定義ContentProvider來明確地聲明我想要放置Android將要下載的數據的位置?這聽起來很奇怪,對自定義格式的支持非常棘手...... :( – Tigran 2011-01-30 20:58:28

+0

嗯......你嘗試.pdf?因爲這是一個非常常見的文件類型,可能它已經註冊到另一個應用程序了。不知道你是否可以用你的程序覆蓋該設置。你是否試過用你想要的文件類型,STL? 如果你只是想在你的智能手機上進行關聯,並且不關心它不會被代碼所感染,你可以這樣做: 菜單 - >設置 - >應用程序 - >管理應用程序,然後選擇一個默認的並點擊清除默認按鈕 – gnclmorais 2011-01-30 23:27:48

6

我感到意外的是gnclmorais解決方案應該管用。因爲它在一個intent-filter中有多個data條目對我無效。到底是什麼做的工作是多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> 

注意,有一個data進口在pathPatternmimeType沒有正常工作。最後並非最不重要我會建議在獲取文件名時進行一些空檢查:

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

樣本中缺少實際的文件加載。它應該在「打開文件」日誌命令之後插入。

5

我試過其他的解決方案,這是唯一一個爲我工作:

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

是否有人有一個想法,爲什麼其他的人不工作?