两个应用之间的通信问题:queryIntentActivities返回空列表

时间:2018-10-27 15:51:43

标签: android android-intent

我正在尝试使用意图在两个应用之间建立通信。第一个应用程序A将询问用户两个数字,当用户输入这些数字并按下按钮时,该应用程序A将向结果B发送请求结果,该应用程序B将计算数字的总和并等待按钮单击事件将其发送回。结果到AppA。 我这里遇到的问题是queryIntentActivities方法返回一个空列表,我认为这意味着有关应用B意图的信息未添加到意图的内部目录中。

这是应用A的代码:

final int CALLER_REQUEST = 1 ;
public static final String MY_ACTION = "com.android.intentapp3.myaction";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView updated = (TextView) findViewById(R.id.result_tv);
    updated.setText("Not calculated yet!");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    //if(id == R.id.action_settings)
      //  return true;
    return super.onOptionsItemSelected(item);
}

public void onClick(View v) {
    EditText nbr1 = (EditText) findViewById(R.id.number1_val);
    EditText nbr2 = (EditText) findViewById(R.id.number2_val);

    try {
        int n1 = Integer.parseInt(nbr1.getText().toString());
        int n2 = Integer.parseInt(nbr2.getText().toString());
    } catch (Exception e) {
        Toast.makeText(v.getContext(), "Error!", Toast.LENGTH_SHORT).show();
        return;
    }

    Intent intent = new Intent(MainActivity.MY_ACTION);
    intent.putExtra("number1", Integer.parseInt(nbr1.getText().toString()));
    intent.putExtra("number2", Integer.parseInt(nbr2.getText().toString()));
    intent.setAction(Intent.ACTION_SEND);
    PackageManager pm = getPackageManager();
    List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
    if (activities.size() > 0) {
        Toast.makeText(this, "activity found", Toast.LENGTH_SHORT).show();
        startActivityForResult(intent, CALLER_REQUEST);
    }
    else
    {
        Toast.makeText(this, "no activity found", Toast.LENGTH_SHORT).show();

    }
}

应用B的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    setContentView(R.layout.activity_main);
    if(intent!=null && intent.getAction()=="com.android.intentapp3.myaction"){
        TextView number1 = (TextView) findViewById(R.id.number1);
        TextView number2 = (TextView) findViewById(R.id.number2);

        if(number1==null)
        {
            Toast.makeText(getBaseContext(),"number 1 is null",Toast.LENGTH_SHORT).show();
            return;
        }
        number1.setText(intent.getExtras().getString("number1"));
        number2.setText(intent.getExtras().getString("number2"));

        int n1 = Integer.parseInt(intent.getExtras().getString("number1"));
        int n2 = Integer.parseInt(intent.getExtras().getString("number2"));

        int sum = n1 + n2 ;

        TextView result = (TextView) findViewById(R.id.result);
        result.setText(Integer.toString(sum));
    }
}

B的清单xml文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.intentfilterexemple">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="text/plain"/>
        </intent-filter>
    </activity>
</application>

</manifest>

1 个答案:

答案 0 :(得分:1)

  

我认为这意味着有关应用B的意图的信息未添加到意图的内部目录中

在这种情况下,您的Intent<intent-filter>不匹配。

替换:

intent.setAction(Intent.ACTION_SEND);

具有:

intent.setAction(Intent.ACTION_SEND).setType("text/plain");

看看你是否有更好的运气。