我正在为自己编写一个语言词典应用程序(作为一种 Android 编程学习练习)。
我希望我的应用程序在其他应用程序的意图选择器中列为一个选项,因此我将这些代码行添加到我的清单中:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
我的应用程序成功出现在其他应用程序(例如浏览器)的操作菜单中,这很好。当我从浏览器操作菜单中选择它时,我的应用程序也通过 Share 成功调用。
现在我希望我的应用程序接收和处理从其他应用程序发送的文本(一个单词),然后自动查找文本以了解其定义。我将以下代码行添加到我的应用程序的主要活动中:
//(under onCreate)
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
EditText edittext = (EditText) findViewById(R.id.edWord);
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null) {
edittext.setText(sharedText);
}
}
}
但是在这个阶段,每次通过共享从操作菜单中选择我的应用程序时,浏览器都会崩溃。
所以涉及到我的问题:
- 我做错了什么?
- 如何/我可以做些什么来“强制”我的应用程序接受来自其他应用程序的文本,并自动显示其定义?
抱歉,这些都是菜鸟问题(不过,我很头疼)。
非常感谢您的帮助。
更新 1
谢谢,通用软件。浏览器崩溃时什么也没有产生,但是当我从我的应用程序的 Web 视图中选择“共享”时,我得到了这个日志猫:
08-09 18:17:23.726: W/dalvikvm(1111): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
08-09 18:17:23.776: E/AndroidRuntime(1111): FATAL EXCEPTION: main
08-09 18:17:23.776: E/AndroidRuntime(1111): java.lang.RuntimeException: Unable to start activity ComponentInfo{peter.kadict/peter.kadict.Kadict}: java.lang.NullPointerException
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.access$600(ActivityThread.java:122)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.os.Handler.dispatchMessage(Handler.java:99)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.os.Looper.loop(Looper.java:137)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.main(ActivityThread.java:4340)
08-09 18:17:23.776: E/AndroidRuntime(1111): at java.lang.reflect.Method.invokeNative(Native Method)
08-09 18:17:23.776: E/AndroidRuntime(1111): at java.lang.reflect.Method.invoke(Method.java:511)
08-09 18:17:23.776: E/AndroidRuntime(1111): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-09 18:17:23.776: E/AndroidRuntime(1111): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-09 18:17:23.776: E/AndroidRuntime(1111): at dalvik.system.NativeStart.main(Native Method)
08-09 18:17:23.776: E/AndroidRuntime(1111): Caused by: java.lang.NullPointerException
08-09 18:17:23.776: E/AndroidRuntime(1111): at peter.kadict.Kadict.onCreate(Kadict.java:449)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.Activity.performCreate(Activity.java:4465)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
08-09 18:17:23.776: E/AndroidRuntime(1111): ... 11 more
更新 2
感谢CommonsWare ,这段代码解决了这个问题。
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null) {
setContentView(R.layout.main);
EditText edittext = (EditText) findViewById(R.id.edWord);
edittext.setText(sharedText);
}
}
}
但它没有完成它的任务:应用程序已加载,但似乎没有接收和处理从其他应用程序发送的文本(单词)。
你们能帮忙吗?非常感谢。