通过“共享”菜单从其他应用程序接收文本

时间:2012-08-09 11:04:01

标签: java android android-intent

我正在为自己编写语言词典应用程序(作为一种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. 我如何/我该怎么办?#34;强迫&#34;我的应用程序接受文本 来自其他应用,并自动显示其定义?
  3. 很抱歉这些都是noobie问题(不过我很头疼)。

    非常感谢你的帮助。

    更新1

    谢谢,CommonWare。当浏览器崩溃但我选择&#34;分享&#34;从我的应用程序的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);
                    }
            }     
        }
    

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

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

3 个答案:

答案 0 :(得分:1)

或者:

  • 您尚未拨打setContentView()

  • 您的EditText小部件android:id @+id/edWord

  • 清理项目(例如,项目&gt;从Eclipse主菜单中清除)并再次尝试

答案 1 :(得分: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);

    }
}

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

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

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

答案 2 :(得分:0)

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

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