我有一个设计,从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);
}
}
}
谢谢!
您需要将您的应用程序与文件扩展名关联。 要做到这一点,添加意图过滤器中的这两条线段和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="*/*" />
=>匹配的mime类型
<data android:pathPattern=".*\\.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"
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文件的意图监听器 ,如果用户决定使用它,这将调用您的应用程序(除非用户以前关联的文件类型为TXT到另一个应用程序...)
您的应用程序并不需要主动将赶上意图。 一旦安装,该系统将其识别为“转到应用程序”用于特定MIME类型和/或扩展选择了(不是由MIME类型相关联不容易)中的一个。
优点:您可以有一个单独的主要活动,当你的广播接收器被调用时,它会在相同的沙箱应用程序中执行 ,而不影响它(你将必须实现在您的主要活动的onResume
方法)。
您可以阅读文本数据转换为静态变量(S)[草率]或者你可以把它放在一个SQLite数据库,这是永久性的,安全的 ,无论应用程序和/或电话的关停,例如。
你可以有活动selfterminating甚至从来没有生火的布局/窗口 - 这是有点怪异的情况下,用户想要一些那种txt文件正确和完全消耗的应用程序确认。