【问题标题】:Why isn't my app on the list of apps to open txt file?为什么我的应用不在打开 txt 文件的应用列表中?
【发布时间】:2012-06-24 13:18:02
【问题描述】:

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


    【解决方案1】:

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

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

    &lt;data android:scheme="file" /&gt; => 这定义文件必须是本地的,而不是来自 http 或 else

    &lt;data android:mimeType="*/*" /&gt; => 匹配任何 mime 类型

    &lt;data android:pathPattern=".*\\.txt" /&gt; => 在这里您可以指定要匹配的扩展名

    希望有帮助

    【讨论】:

    • 我只希望我的应用程序出现在打开文本文件的列表中,但现在我的应用程序在每种类型的文件的列表中。我确实有 ,但我想知道是否应该指定 mimeType。我应该怎么做才能限制我的应用只出现在打开的文本文件列表中?
    • 将 mime 类型更改为 &lt;data android:mimeType="text/plain" /&gt;
    • 我把这个放在哪里?我尝试了thisthis,但都没有奏效。
    【解决方案2】:

    详细说明 HERO 的伪代码,这很有效:

    像这样更改&lt;manifest&gt;

    <?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 类型关联)的“goto 应用程序”之一。

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

    你可以读取文本数据静态变量[sloppy]或者你可以把它放在一个SQLite数据库中,这是永久且安全的,例如,无论应用程序和/或手机是否关闭。

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

    【讨论】:

      【解决方案3】:

      您必须使用过滤器属性注册一个 ACTIVITY 而不是广播接收器。

      【讨论】:

        猜你喜欢
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2018-03-10
        • 2010-09-30
        • 1970-01-01
        相关资源
        最近更新 更多