为什么我的应用程序没有出现在打开txt文件的应用程序列表中?

问题描述 投票:0回答:4

我有一个文本阅读器应用程序,旨在当我单击文本文件将其打开时接收来自 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>

我的扩展广播接收器

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

}

}
}

谢谢!

android android-intent broadcastreceiver
4个回答
17
投票

您需要将您的应用程序与文件扩展名关联起来。为此,请在意图过滤器中添加这两行,然后就可以开始了

<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" />
=> 您可以在此处指定要匹配的扩展名

希望这有帮助


8
投票

详细阐述 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>

放下你的广播接收器,因为这是不必要的。

更改您的 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 文件创建了一个 intent 侦听器,如果用户决定使用您的应用程序,它将调用您的应用程序(除非用户之前已将 TXT 文件类型关联到另一个应用程序...)

您的应用程序无需处于活动状态即可捕获意图。安装后,系统会将其识别为您选择的特定 mime 类型和/或扩展名的“转到应用程序”之一(比按 mime 类型关联更容易)。

奖励:您可以有一个单独的 MAIN 活动,当您的 BroadcastReceiver 被调用时,它将在与您的应用程序相同的沙箱中执行,而不会影响它(您必须在 MAIN 活动的

onResume
方法中实现它)。

您可以将文本数据读入静态变量[马虎]或者您可以将其放置在SQLite数据库中,这是永久且安全的,无论应用程序和/或手机是否关闭,例如。

您可以让 Activity 自行终止,甚至永远不会启动布局/窗口 - 如果您的用户想要某种确认 txt 文件已正确且完全被应用程序使用,这有点奇怪。


4
投票

您必须注册一个活动而不是具有过滤器属性的广播接收器。


0
投票

text/plain
Mime 类型适用于除三星之外的所有 Android 设备。我不知道为什么会这样,但问题似乎是他们的手机特有的。您需要将
application/txt
mime 类型添加到 AndroidManifest 以也定位三星手机。

© www.soinside.com 2019 - 2024. All rights reserved.