Jas*_*ing 9 android broadcastreceiver android-intent
我有一个文本阅读器应用程序,旨在当我点击文本文件打开它时从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>
Run Code Online (Sandbox Code Playgroud)
我的扩展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...");
}
}
Run Code Online (Sandbox Code Playgroud)
我的活动由广播接收机打开
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
Hei*_*ein 15
您需要将您的应用与文件扩展名相关联.为此,请在意图过滤器中添加这两行,并且不错
<data android:scheme="file" />
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.pdf" />
Run Code Online (Sandbox Code Playgroud)
而你的清单看起来就像这样
<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>
Run Code Online (Sandbox Code Playgroud)
<data android:scheme="file" /> =>这定义文件必须是本地文件,而不是http或其他文件
<data android:mimeType="*/*" /> =>匹配任何mime类型
<data android:pathPattern=".*\\.txt" /> =>这是您指定要匹配的扩展名的位置
希望这有帮助
详细阐述了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>
Run Code Online (Sandbox Code Playgroud)
放弃你的广播接收器,因为它是不必要的.
更改您的BroadcastReceiverTest1Activity类(它不需要是您的MAIN活动,请参阅下面的BONUS):
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
你已经有效地为TXT文件创建了一个意图监听器,如果用户决定使用它,它将调用你的应用程序(除非用户以前将文件类型TXT与另一个应用程序关联...)
你的应用程序不需要处于活动状态以捕获意图.一旦安装,系统会将其识别为您选择的特定mime类型和/或扩展(不像mime类型关联那么容易)的"goto应用程序"之一.
奖励:您可以拥有单独的MAIN活动,当您调用BroadcastReceiver时,它将在与您的应用程序相同的沙箱中执行,而不会影响它(您必须在MAIN活动的onResume方法中实现它).
你可以将文本数据读入静态变量[sloppy]或者你可以将它放在SQLite数据库中,这是永久的和安全的,例如,无论应用和/或电话关闭.
你可以让活动继续进行,甚至不会启动布局/窗口 - 如果你的用户想要某种确认txt文件被app正确和完全消耗的话,这有点奇怪.
| 归档时间: |
|
| 查看次数: |
12802 次 |
| 最近记录: |