2012-06-22 2 views
8

У меня есть приложение для чтения текста, которое предназначено для получения намерений от системы Android, когда я нажимаю на текстовый файл, чтобы открыть его. Но мое приложение не входит в список, который выдает система. Ниже приведены мои коды:Почему мое приложение в списке приложений не открывает файл txt?

Manifest

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

Мой расширенный BroadcastReceiver

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..."); 
} 
} 

Моя деятельность будет открыта вещательного приемника

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

} 

} 
} 

Спасибо!

ответ

12

Вам необходимо связать приложение с расширением файла. Чтобы сделать это, добавьте эти две линии в пределах намерения фильтра и u'r хорошо идти

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

И ваш манифест будет выглядеть следующим образом

<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" /> => это определить, что файл должен быть местные, а не от HTTP или еще

<data android:mimeType="*/*" /> => соответствовать любой тип пантомимы

<data android:pathPattern=".*\\.txt" /> => это где вы указываете, что е Xtension вы хотите, чтобы соответствовать

Надежда эта помощь

+0

Я просто хочу, чтобы мое приложение находилось в списке открывающих текстовых файлов, но теперь мое приложение находится в списке для каждого типа файлов. У меня было , но мне интересно, должен ли я указывать mimeType. Что я должен сделать, чтобы ограничить мое приложение только появлением в списке открывающих текстовых файлов? –

+2

изменить тип mime на '' – Hein

+0

Спасибо! Это здорово! –

3

Вам необходимо зарегистрировать ACTIVITY, а не широковещательный приемник с атрибутами фильтра.

+0

спасибо! Я так понял. –

6

разработки на псевдокоде ГЕРОЯ, это эффективно работает:

Изменение <manifest> так:

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

уроните широковещательный приемник, потому что это не нужно.

изменить ваш класс BroadcastReceiverTest1Activity (это делает не нужно быть вашей основной деятельности см БОНУС ниже):

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); 
     } 
    } 
} 

вы эффективно создана Намерение слушателем для TXT файлов, который будет вызывать app, если пользователь решает использовать его (если пользователь ранее не связал тип файла TXT с другим приложением ...)

Ваше приложение делает НЕ должно быть активным, чтобы поймать намерения. после установки система распознает его как одно из «приложений goto» для определенных типов и/или расширений mime (менее простое, чем сопоставление типом mime), которое вы выбрали.

БОНУС: вы можете иметь отдельную ГЛАВНОЕ активность и когда ваш BroadcastReceiver называется, он будет выполняться в той же песочнице как приложения, не влияя на его (вы должны осуществить это в onResume методе вашего основного вида деятельности в) ,

вы можете прочитать текстовые данные в статической переменной (ов) [неаккуратно] или вы можете поместить его в SQLite дБ, что постоянное и безопасное, независимо от приложения и/или телефон например, закрытие.

У вас может быть операция selfterminating и никогда даже не запускать макет/окно - что-то странно, если ваш пользователь хочет получить какое-то подтверждение, что txt-файл был правильно и полностью поглощен приложением.

Смежные вопросы