2011-01-25 9 views
19

Quiero escribir una aplicación simple de visor STL (archivo de datos geométricos) en Android, pero no puedo reconocer un formato en el sistema. Lo que escribí en mi archivo de manifiesto de la aplicación es:Registre un nuevo tipo de archivo en 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> 

Pero en el momento que inicie el navegador e ir a descargar algún archivo de ejemplo STL, descarga se interrumpe y me informó de que el tipo de archivo de datos es desconocida para el sistema. No tengo ningún dispositivo Android, así que use solo emulador, y para el desarrollo utilizo C# en MonoDroid (pero no creo que ese sea el problema honestamente)

¿Alguna idea sobre el tema?

Gracias de antemano.

+0

Solo estoy adivinando, pero podría tratar de omitir el elemento de host. Además, Logcat puede mostrarle qué intención tiene qué patrón 'entra' para que pueda comprender mejor lo que el sistema está buscando. –

Respuesta

21

estoy usando este Manifiesto para registrar (por ejemplo) el tipo de archivo .stl con mi solicitud:

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

Como se puede ver, estoy une la extensión de archivo .stl a la actividad OdinActivity. Dentro de la OdinActivity, utilizo la siguiente línea para obtener la ruta del archivo para que pueda abrirlo:

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

Entonces sólo abro para leer de él:

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

hm .. Intenté cambiar el formato .mmmm por uno conocido (utilicé PDF). Vaya a mi cuenta de GMail e intente descargar un DPF de uno de los correos que tengo. Obtuve exactamente el mismo resultado negativo. Así que tengo algunas dudas: ¿necesito implementar mi ContentProvider personalizado para declarar de forma explícita dónde me gustaría poner datos que Android va a descargar? Suena realmente extraño para mí, que el soporte del formato personalizado es tan complicado ... :( – Tigran

+0

Hm ... ¿Has probado .pdf? Dado que es un tipo de archivo muy común, probablemente ya esté registrado en otra aplicación. no sé si puede sobreescribir esa configuración con su programa. ¿Ha intentado con el tipo de archivo que desea, STL? Si solo desea la asociación en su teléfono inteligente, y no le importa el código, puede hacerlo siempre: Menú -> Configuración -> Aplicaciones -> Administrar aplicaciones y elija la que está predeterminada ahora y haga clic en el botón Borrar valores predeterminados – gnclmorais

+0

Sí, lo intenté con STL también. Por lo tanto, la razón para probar PDF, como es conocido formato y con el apoyo casi de todos, para entender lo que está mal. Pero lo extraño es que incluso con PDF obtuve el mismo resultado negativo, como escribí. Utilizo un dispositivo emulador no real, por lo que me pregunto si hay algún problema al usar un emulador para este caso. – Tigran

6

me sorprende que gnclmorais solución Deberia trabajar. Debido a que tener múltiples entradas data en un intent-filter no funcionó para mí. Lo que funcionaba en la final fue múltiple intent-filter en una 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> 

Nota que el tener tanto pathPattern y mimeType en una data entrada no funciona tan bien. Durante todo ello, me permito sugerir algunos cheques nulos al obtener el nombre del archivo:

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

La carga real del archivo no se encuentra en la muestra. Se debe insertar después del comando de registro "Abrir archivo".

+1

Im sorprendido de que te sorprendió :). Verá que la solución gnclmorais se usa para una sola extensión de archivo (stl) y su solución se trata de diferentes extensiones de archivos (pf, df, af, etc.). Obviamente, tenía que usar varios filtros de intención cada uno para cada extensión – Stan

+0

@Stan ¿Y por qué deberían funcionar varios 'android: scheme' en lugar de múltiples' android: pathPattern'? No puedo ver ninguna razón obvia para eso. Razones oscuras, sí, siempre hay esas. Pero no es obvio. Tenga en cuenta que si mira http://developer.android.com/reference/android/content/Intent.html verá que todos los ejemplos solo tienen una sección '' por intento. – Martin

+0

¿Qué tipo de tipo de mime es "application/x-fx-602p.all"? ¿Cómo está eso construido? ¿Lo registró de alguna manera para que el sistema lo reconozca? – AareP

5

probé las otras soluciones y este es el único que funciona para mí:

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

alguien tiene una idea de por qué los otros no funcionan?

Cuestiones relacionadas