3

我正在为自己编写一个语言词典应用程序(作为一种 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. 我做错了什么?
  2. 如何/我可以做些什么来“强制”我的应用程序接受来自其他应用程序的文本,并自动显示其定义?

抱歉,这些都是菜鸟问题(不过,我很头疼)。

非常感谢您的帮助。

更新 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);
                }
        }     
    }

但它没有完成它的任务:应用程序已加载,但似乎没有接收和处理从其他应用程序发送的文本(单词)。

你们能帮忙吗?非常感谢。

4

3 回答 3

1

任何一个:

  • 你没有打电话setContentView(),或者

  • 您没有带有of的EditText小部件,或android:id@+id/edWord

  • 清理您的项目(例如,Eclipse 主菜单中的 Project > Clean)并重试

于 2012-08-09T12:17:17.480 回答
1

所以我遇到了同样的问题,我不知道活动有什么问题,所以我通过获取共享文本并将其放入一个捆绑包中解决了这个问题,以实现我想做的任何事情

这是我的代码

public class GetFromShared extends Activity {
    TextView tex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Intent intent = this.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);
                Log.d("Shared text is", sharedText);

                Intent rooy = new Intent(getApplicationContext(),
                        BayenELText.class);

                rooy.putExtra("GotText", sharedText);
                startActivity(rooy);

            }
        }

    }
}

接收类是

public class BayenELText extends Activity {
    TextView blabla;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.getsharedtext);
        blabla = (TextView) findViewById(R.id.etSharedText);
        Bundle extras = getIntent().getExtras();

        String hloho = extras.getString("GotText");
        blabla.setText(hloho);

    }
}

当它从共享调用时,日志会显示共享文本,但是当它调用时我想到的是 Intent 过滤器

<action android:name="android.intent.action.SEND" />

没有权限对视图进行任何更改,以便我如何解决它并且它工作正常;)

于 2012-11-13T18:24:25.823 回答
0

当我看到这个 logcat 输出时,我立即想到找不到活动的事实。如果是这种情况,将抛出 NPE。

所以: 1. 你的 AndroidManifest.xml 中有活动吗?2. 可以自己开始活动adb shell am start -n peter.kadict/peter.kadict.Kadict吗?

于 2012-08-09T11:48:41.837 回答