2012-06-11 19 views
5

Estoy intentando asociar mi aplicación con la extensión. He leído documentation y somequestions sobre el problema. Pero los principales exploradores de archivos (como es file explorer, astro, file manager del software Rhythm) no pueden abrir mis archivos.Filtro de intención para exploradores de archivos comunes

Mi manifest archivo:

<activity android:name="com.comapping.android.map.MapActivity" android:configChanges="orientation|keyboardHidden"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="file" android:host="*" android:pathPattern=".*\\.comap" android:mimeType="*/*" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="content" android:host="*" android:pathPattern=".*\\.comap" android:mimeType="*/*" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity>

Y si intento abrir el archivo de mi solicitud para el uso de código siguiente todo funciona bien (selector no se muestra):

String extension = ""; 
int dotIndex = downloadedFile.lastIndexOf('.'); 
if (dotIndex != -1) { 
    extension = downloadedFile.substring(dotIndex + 1, downloadedFile.length()); 
} 

// create an intent 
Intent intent = new Intent(android.content.Intent.ACTION_VIEW); 
Uri data = Uri.fromFile(new File(downloadedFile)); 
String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
if (type == null || type.length() == 0) { 
    // if there is no acceptable mime type 
    type = "application/octet-stream"; 
} 
intent.setDataAndType(data, type); 

// get the list of the activities which can open the file 
List resolvers = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
if (resolvers.isEmpty()) { 
    (new AlertDialog.Builder(context) 
      .setMessage(R.string.AttachmentUnknownFileType) 
      .setNeutralButton(R.string.NeutralButtonText, null) 
      .create()).show(); 
} else { 
    context.startActivity(intent); 
}

si trato de abrirlo Al usar el administrador de archivos de OpenIntents, todo es normal: mostró un selector largo con muchas aplicaciones y mi aplicación en la lista.

Pero si trato de abrirlo con es file explorer o Rhythm file explorer, mostró su selector personalizado (abrir como texto/imagen/video/audio). Es malo.

Y si intento abrirlo con Astro, abre el administrador de archivos de OpenIntent. También es malo.

¿Hay alguna solución al problema? ¿Quién está equivocado en tal comportamiento?

Gracias por cualquier ayuda.

Respuesta

0

Parte del problema aquí son todas las formas diferentes en que las personas envuelven una intención compartida para, por ejemplo, un archivo que resuelve como text/plain en el identificador mime de Android.

Mi enfoque ha sido averiguar qué tipos de mime son los archivos que quiero. Luego configuro mis filtros manifiestos para esos tipos. Yo uso dos filtros El primero solo filtra los mimos que quiero. El segundo es una copia de los primeros esquemas plus.

Luego pruebo enviando acciones de aplicaciones como lo ha hecho. Cuando uno no funciona, uso un brindis para ver qué obtengo para una CORRIENTE y luego la modifico para que quepa. Por ejemplo, si consigo una corriente OpenIntent, tengo que quitar

content://org.openintents.filemanager 

que me deja con la ruta. Sobre todo, sólo tengo que quitar:

file:// 

pero siempre es algo porque todo el contenido/Uri/esquema de Intención es un whatsit libre para todos clúster.

MÁS TARDE. Acabo de tropezar con esto:

Intent intent = getIntent();     
String name = intent.getData().getPath(); 

Quizás eso sea bueno para usted. Voy a intentarlo pronto yo mismo.

Cuestiones relacionadas