Вопрос по android-intent, broadcastreceiver, android – Почему моего приложения нет в списке приложений для открытия txt файла?

8

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

манифест

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

}

}
}

Спасибо!

Ваш Ответ

3   ответа
6

разрабатывая псевдокод HERO, это эффективно работает:

изменить<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>

drop your broadcast receiverпотому что это ненужно.

изменить свой класс BroadcastReceiverTest1Activity (он делаетNOT need to be your MAIN activityсм. БОНУС ниже):

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

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

ваше приложение делаетNOT need to be active поймать намерения. после установки система распознает его как одно из «приложений goto»; для определенных типов и / или расширений пантомимы (менее легко, чем ассоциирование по типу пантомимы), которые вы выбрали.

БОНУС: у вас может быть отдельное ОСНОВНОЕ действие, и когда ваш BroadcastReceiver вызывается, он будетexecute within the same sandbox как ваше приложение, не влияя на него (вы должны будете реализовать это в своей ОСНОВНОЙ деятельности).onResume метод).

вы можетеread the text data вstatic variable(s) [sloppy] ИЛИ вы можете поместить его вSQLite дБ, который являетсяpermanent AND safeНапример, независимо от приложения и / или выключения телефона.

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

3

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

Спасибо! Я вроде понял это. Jason Ching
14

Вам нужно связать ваше приложение с расширением файла. Для этого добавьте эти две строки в фильтр намерений и добро пожаловать

<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" /> = & GT; это определяет, что файл должен быть локальным, а не из http или иначе

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

<data android:pathPattern=".*\\.txt" /> = & GT; это где вы указываете, какое расширение вы хотите соответствовать

Надеюсь это поможет

изменить тип пантомимы на<data android:mimeType="text/plain" />
Спасибо! Работало отлично! Jason Ching
Я просто хочу, чтобы мое приложение было в списке открываемых текстовых файлов, но теперь мое приложение находится в списке для каждого типа файлов. У меня был & lt; data android: pathPattern = & quot;. * \\. Txt & quot; / & GT; Интересно, стоит ли указывать mimeType? Что я должен сделать, чтобы ограничить мое приложение только появлением в списке открываемых текстовых файлов? Jason Ching

Похожие вопросы