2012-06-22 15 views
8

Tengo una aplicación de lectura de texto que está diseñada para recibir la intención del sistema Android cuando hago clic en un archivo de texto para abrirlo. Pero mi aplicación no está en la lista que apareció en el sistema. A continuación son mis códigos:¿Por qué mi aplicación no está en la lista de aplicaciones para abrir el archivo txt?

Manifiesto

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.broadcastreceivertest1" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="8" /> 

<application 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" > 
<activity 
android:label="@string/app_name" 
android:name=".BroadcastReceiverTest1Activity" > 
<intent-filter > 
<action android:name="android.intent.action.MAIN" /> 

<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 

<receiver android:name="MyBroadcastReceiver"> 
<intent-filter> 
<action android:name="android.intent.action.ACTION_VIEW" /> 
<action android:name="android.intent.action.ACTION_EDIT" /> 
<action android:name="android.intent.action.ACTION_PICK" /> 
<data android:scheme="file" /> 
<data android:mimeType="*/*" /> 
<data android:pathPattern=".*\\.txt" />  
<data android:host="*" /> 
</intent-filter> 
</receiver> 

</application> 

</manifest> 

Mi BroadcastReceiver extendida

public final class MyBroadcastReceiver extends BroadcastReceiver { 
private String TAG = "MyBroadcastReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) { 
// TODO Auto-generated method stub 
Intent i = new Intent(context, BroadcastReceiverTest1Activity.class); 
i.putExtra("URI", intent.getData()); 
context.startActivity(i); 
Log.d(TAG, "Leaving onReceived..."); 
} 
} 

Mi actividad a ser abierto por el receptor de radiodifusión

public class BroadcastReceiverTest1Activity extends Activity { 

private String uri =""; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
final Intent intent = getIntent(); 

final String action = intent.getAction(); 

if(Intent.ACTION_VIEW.equals(action)){ 
uri = intent.getStringExtra("URI"); 
TextView textView = (TextView)findViewById(R.id.textView); 
textView.setText(uri); 

} 

} 
} 

Gracias!

Respuesta

12

Necesita asociar su aplicación con la extensión de archivo. Para ello, agregue estas dos líneas dentro del filtro intención y u'r bueno para ir

<data android:scheme="file" /> 
<data android:mimeType="*/*"/> 
<data android:pathPattern=".*\\.pdf" /> 

Y el manifiesto se vería así

<activity name="com.your.activity"> 
    <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="file" /> 
     <data android:mimeType="*/*" /> 
     <data android:pathPattern=".*\\.txt" /> 
    </intent-filter> 
</activity> 

<data android:scheme="file" /> => esta definición que el archivo debe estar local, no de http o bien

<data android:mimeType="*/*" /> => adaptarse a cualquier tipo de MIME

<data android:pathPattern=".*\\.txt" /> => Aquí es donde puede especificar qué correo XTension desea hacer coincidir

Esperanza esta ayuda

+0

Solo quiero que mi aplicación esté en la lista de archivos de texto de apertura, pero ahora mi aplicación está en la lista para cada tipo de archivo. Tenía , pero me pregunto si debería especificar mimeType. ¿Qué debo hacer para restringir mi aplicación a solo aparecer en la lista de archivos de texto de apertura? –

+2

cambie el tipo de mime a '' – Hein

+0

¡Gracias! ¡Funcionó muy bien! –

3

Debes registrar una ACTIVIDAD no un receptor de difusión con los atributos de filtro.

+0

gracias! Yo como que entendí eso. –

6

elaborar el pseudo código de HERO, esto funciona de manera efectiva:

cambio del <manifest> así:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.broadcastreceivertest1" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="9" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:label="@string/app_name" 
      android:name=".BroadcastReceiverTest1Activity" > 
      <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="file" /> 
       <data android:mimeType="*/*" /> 
       <data android:pathPattern=".*\\.txt" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

deje caer su receptor de radiodifusión, porque es innecesario.

cambio de su clase BroadcastReceiverTest1Activity (lo hace no tiene por qué ser su principal actividad, ver PRIMA abajo):

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
public class BroadcastReceiverTest1Activity extends Activity { 
    private String TAG = "TagOpenTxt"; 
    private String uri =""; 
    private Uri uri2; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     final Intent intent = getIntent(); 
     final String action = intent.getAction(); 

     if(Intent.ACTION_VIEW.equals(action)){ 
      //uri = intent.getStringExtra("URI"); 
      uri2 = intent.getData(); 
      uri = uri2.getEncodedPath() + " complete: " + uri2.toString(); 
      TextView textView = (TextView)findViewById(R.id.textView); 
      textView.setText(uri); 
      // now you call whatever function your app uses 
      // to consume the txt file whose location you now know 
     } else { 
      Log.d(TAG, "intent was something else: "+action); 
     } 
    } 
} 

que efectivamente haya creado una de escucha atento para txt, que llame a su aplicación SI el usuario decide usarla (a menos que el usuario haya asociado previamente el tipo de archivo TXT a otra aplicación ...)

su aplicación no es NO es necesario que esté activo para detectar intenciones. una vez instalado, el sistema lo reconoce como una de las "aplicaciones goto" para los tipos y/o extensiones de mime particulares (menos fácil que asociar por tipo de mimo) que elija.

PRIMA: usted puede tener una actividad PRINCIPAL separado y cuando su BroadcastReceiver se llama, se ejecutar dentro de la misma zona protegida como su aplicación, sin impactar en él (que tendrá que poner en práctica que en el método de su principal actividad onResume) .

puede leer los datos de texto en variable (s) estática [descuidado] O se puede colocar en una SQLite db , que es permanente y segura, independientemente de la aplicación y/o teléfono apagando, por ejemplo.

puede tener la actividad autolimitada y nunca encender un diseño/ventana, lo cual es un poco raro en caso de que su usuario desee algún tipo de confirmación de que el archivo txt fue consumido correcta y completamente por la aplicación.

Cuestiones relacionadas