使用从 "App A" 到 "App B"-Android 的 URI 在 Intentw 中传递参数

Passing parameters in Intentw using URI from "App A" to "App B"-Android

我无法解决我的问题,所以我需要帮助:)

我有两个应用 "App A" 和 "App B"。在 "App A" 中输入两个数字(在两个不同的编辑文本中),然后我单击按钮 "sendwithdata"(这里我使用 URI 从编辑文本传递参数)。我的 "App 2" 从 "App A" 捕获参数,将两个数字相加并显示结果。 我认为从 uri 获取参数有问题。

应用程序 A

public class WprowadzanieLiczbActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_wprowadzanie_liczb);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_wprowadzanie_liczb, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public void sendwithData(View view) {
    String adres2 = adresUriSumy();
    Uri uri = Uri.parse(adres2);
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
}

private String adresUriSumy() {
    EditText liczbaAInput = (EditText) findViewById(R.id.A);
    Editable liczbaA = liczbaAInput.getText();
    String liczbaAParam = String.format("liczbaA=%s", liczbaA);

    EditText liczbaBInput = (EditText) findViewById(R.id.B);
    Editable liczbaB = liczbaBInput.getText();
    String liczbaBParam = String.format("liczbaA=%s", liczbaB);

    String podstawowyAdres = "calculator://wwsis.com.pl/suma";

    String adres2 = String.format("%s?%s%s", podstawowyAdres, liczbaAParam, liczbaBParam);

    return (adres2);
}}

应用 B

public class WyswietlanieActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_wyswietlanie);
    wezDanezUri();

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_wyswietlanie, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


private void wezDanezUri() {
    Uri uri = getIntent().getData();
    if (uri != null) {
        double liczbaA = getDoubleParam(uri, "liczbaA");
        double liczbaB = getDoubleParam(uri, "liczbaB");

        double suma = liczbaA + liczbaB;

        TextView textView = (TextView) findViewById(R.id.wyswietlacz);


        textView.setText(liczbaA + liczbaB + Double.toString(suma));

    }


}

private double getDoubleParam(Uri uri, String queryParamName) {
    String wzorzmiennej = uri.getQueryParameter(queryParamName);
    double value = 0.0;
    try {
        value = Double.parseDouble(wzorzmiennej);
    } catch (Exception e) {
    } // NumberFormatException or NullPointerException
    return (value);
}}

应用程序 B 清单

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".WyswietlanieActivity"
        android:label="@string/app_name" >
        <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.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="calculator" android:host="wwsis.com.pl" android:path="/suma"/>
        </intent-filter>
    </activity>
</application>

我认为您应该在 Intent 上使用 putExtra() class。

请参阅 the docs for an example. Here's another post 了解如何执行此操作。

我运行代码并找出问题所在。

主要问题是参数之间缺少 &,因此第一个参数包含 liczbaA 之后的所有内容,而第二个参数为空。

您还不小心在 adresUriSumy() 方法中使用了两次 liczbaA

我将其切换为显式使用字符串作为 EditText 值,但它也可以像您使用的那样工作,因为它会在每个 Editable 上隐式调用 toString()你在 String.format().

中使用它

最后一个问题是在 App B 中格式化结果。

首先,以下是应用程序 A 的修复程序:

private String adresUriSumy() {
    //Use Strings from the EditText fields:
    EditText liczbaAInput = (EditText) findViewById(R.id.A);
    String liczbaA = liczbaAInput.getText().toString();
    String liczbaAParam = String.format("liczbaA=%s", liczbaA);

    //Use liczbaB below:
    EditText liczbaBInput = (EditText) findViewById(R.id.B);
    String liczbaB = liczbaBInput.getText().toString();
    String liczbaBParam = String.format("liczbaB=%s", liczbaB);//modified

    String podstawowyAdres = "calculator://wwsis.com.pl/suma";

    //notice the & below
    String adres2 = String.format("%s?%s&%s", podstawowyAdres, liczbaAParam, liczbaBParam);

    return (adres2);
}

这是在应用程序 B 中进行的修复:

private void wezDanezUri() {
    Uri uri = getIntent().getData();

    if (uri != null) {

        double liczbaA = getDoubleParam(uri, "liczbaA");
        double liczbaB = getDoubleParam(uri, "liczbaB");

        double suma = liczbaA + liczbaB;

        TextView textView = (TextView) findViewById(R.id.wyswietlacz);

        //modified:
        textView.setText(Double.toString(liczbaA) + " + " + Double.toString(liczbaB) + " = " + Double.toString(suma));

    }
}