2011-01-25 18 views
19

Chcę napisać prostą aplikację przeglądarki STL (plik danych geometrycznych) na Androida, ale nie jestem w stanie rozpoznać formatu w systemie. Co napisałem w moim app pliku manifestu jest:Zarejestruj nowy typ pliku w Androidzie

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

Ale w tej chwili uruchomić przeglądarkę i przejdź ściągnąć jakiś przykładowy plik STL, pobieranie zostanie przerwane, a ja poinformował, że typ pliku danych jest nieznany dla system. Nie mam prawdziwego urządzenia z Androidem, więc używaj tylko emulatora, a do rozwoju używam C# w MonoDroid (ale nie sądzę, że to jest problem uczciwy).

Wszelkie pomysły na temat?

Z góry dziękuję.

+0

Po prostu zgaduję, ale można spróbować pominąć element hosta. Logcat może również pokazać, jaki jest zamiar, z jakim wzorem "wchodzi", aby lepiej zrozumieć, czego system szuka. –

Odpowiedz

21

Używam tego Oczywisty zarejestrować (na przykład) typ pliku .stl z mojego wniosku:

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

Jak widać, jestem łącząc rozszerzenie pliku .stl do działalności OdinActivity. Wewnątrz OdinActivity, używam następujący wiersz, aby uzyskać ścieżkę do pliku, więc mogę go otworzyć:

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

Potem wystarczy otworzyć go odczytać z niego:

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

hm .. Próbowałem, aby zmienić format .mmmm na dobrze znany (użyłem PDF). Przejdź do mojego konta Gmail i próbuj pobrać filtr DPF z jednej z otrzymanych wiadomości e-mail. Mam dokładnie taki sam wynik negatywny. Mam więc pewne wątpliwości: czy muszę zaimplementować mojego niestandardowego dostawcę treści, aby zadeklarować w sposób jawny miejsce, w którym chciałbym umieścić dane pobierane przez Androida? Brzmi naprawdę dziwnie, że obsługa niestandardowego formatu jest tak trudna ... :( – Tigran

+0

Hm ... Próbowałeś .pdf? Ponieważ jest to bardzo popularny typ pliku, prawdopodobnie jest już zarejestrowany w innej aplikacji. nie wiesz, czy możesz zastąpić to ustawienie programem. Czy próbowałeś z wybranym typem pliku, STL? Jeśli chcesz tylko skojarzenie na smartfonie i nie przejmuj się tym, nie używając kodu, zawsze możesz to zrobić: Menu -> Ustawienia -> Aplikacje -> Zarządzaj aplikacjami i wybierz ten, który jest teraz domyślny i kliknij przycisk Wyczyść domyślne – gnclmorais

+0

Tak, próbowałem również z STL. Jest to powód, dla którego warto wypróbować format PDF, który jest dobrze znany i obsługiwany niemal przez wszystkich, aby zrozumieć, co jest nie tak. Ale dziwne jest to, że nawet w przypadku PDF mam taki sam wynik negatywny, jak napisałem. Używam emulatora, a nie urządzenia rzeczywistego, więc zastanawiam się, czy coś złego w użyciu emulatora do tego przypadku. – Tigran

6

Jestem zaskoczony, że gnclmorais rozwiązanie powinno działać. Ponieważ posiadanie wielu wpisów data w jednym intent-filter nie działa dla mnie. Co nie działa w końcu była wielokrotnością intent-filter w jednym 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> 

Uwaga że posiadanie zarówno pathPattern i mimeType w jednym data wpisu nie działa tak dobrze. Ostatnio chciałbym zasugerować kilka sprawdzeń zerowych podczas pobierania nazwy pliku:

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

Rzeczywiste załadowanie pliku brakuje w próbce. Powinien zostać wstawiony po poleceniu "Otwórz plik".

+1

Jestem zaskoczony, że zaskoczyłeś :). Widzisz rozwiązanie gnclmorais używane tylko dla jednego i jedynego rozszerzenia pliku (stl), a twoje rozwiązanie dotyczy różnych rozszerzeń plików (pf, df, af i tak dalej). Obyście musieli użyć kilku filtrów intencyjnych dla każdego rozszerzenia – Stan

+0

@Stan i dlaczego wiele '' android: scheme' powinno działać lepiej niż wiele 'android: pathPattern'? Nie widzę żadnych oczywistych przyczyn takiego stanu rzeczy. Niewyraźne powody - tak, zawsze są takie. Ale nie oczywiste. Zauważ, że jeśli spojrzysz na http://developer.android.com/reference/android/content/Intent.html, zobaczysz, że wszystkie przykłady mają tylko jedną '' sekcję na jeden cel. – Martin

+0

Jaki rodzaj mime to "application/x-fx-602p.all"? Jak to zbudowano? Czy zarejestrujesz go w jakiś sposób, aby system mógł go rozpoznać? – AareP

5

Próbowałem innych rozwiązań i to jest tylko jeden, który pracuje dla mnie:

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

czy ktoś ma pomysł dlaczego inni te nie działają?

Powiązane problemy