将 OnActivityResult 数据从电容器传递回混合应用程序

问题描述 投票:0回答:3

我正在开发一个 Compacitor 混合应用程序。我正在尝试按照此页面中的说明进行操作:https://capacitor.ionicframework.com/docs/plugins/android,要startActivityForResult(来自混合javascript部分),在本机secondActivity中执行某些操作并将结果返回到混合部分。 这是在其他地方问过的类似问题,但没有答案! https://github.com/ionic-team/capacitor/issues/1044 这是关于我的应用程序的简短描述: 离子空白应用程序 + 电容器: 这是我的 home.page.ts 中的代码

import {Component} from '@angular/core';
import {Plugins} from '@capacitor/core';
//typeface
declare global {
    interface PluginRegistry {
        PluginTest2 ? : PluginTest2;
    }
}
interface PluginTest2 {
    goToActivity(): Promise < any > ;
}
@Component({
    selector: 'app-home',
    templateUrl: 'home.page.html',
    styleUrls: ['home.page.scss'],
})
export class HomePage {
    goToSecondActivity() {
    const {PluginTest2} = Plugins;
        PluginTest2.goToActivity().then((result) => {
            // I want data from SecondActivity back here and log it!
            console.log(result);
        })
    }
 }

而 home.page.html 只是一个激活 goToSecondActivity() 的按钮;方法。 在android studio中打开电容器项目后,我添加了这个类:

package com.alihaghighicapacitor.qom;
import android.content.Intent;
import com.getcapacitor.JSObject;
import com.getcapacitor.NativePlugin;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;

@NativePlugin()
public class PluginTest2 extends Plugin {
    @PluginMethod()
    public void goToActivity(PluginCall call) {
        Intent intent = new Intent(getActivity().getApplicationContext(), secondActivity.class);
        startActivityForResult(call, intent, 1);
        // I can return this sillyData! back to "home.page.ts" but I want data from seconfActivity not this class
        JSObject ret = new JSObject();
        ret.put("added", "sillyData!");
        call.success(ret);

    }
    @Override
    protected void handleOnActivityResult(int requestCode, int resultCode, Intent data) {
        super.handleOnActivityResult(requestCode, resultCode, data);
        String recievedMessage = data.getStringExtra("Data");
        // capacitor team tutorial in the page I mentioned earlier instructs to use PluginCall as follows but IT DOES NOT WORK FOR ME!
        PluginCall savedCall = getSavedCall();
        if (savedCall == null) {
        return;
        }
       if (requestCode == REQUEST_IMAGE_PICK) {
       // Do something with the data
       }
    }
}

这是第二个Activity.java:

package com.alihaghighicapacitor.qom;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class secondActivity extends AppCompatActivity {
    EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        editText = findViewById(R.id.editText);
    }

     public void sendMeHome(View view) {
        Intent intent = new Intent();
        String message = editText.getText().toString();
        intent.putExtra("Data", message);
        finish();
    }
}

以及activity_second.xml的相关部分

<Button android:id="@+id/button"
android:onClick="sendMeHome"/>
<EditText android:id="@+id/editText"/>
//clicking the button should get the editText value and send it back to
=> previous activity => to home.page.ts => and log it

此代码触发了 SecondActivity,但除了我在上面代码中注释的sillyData 之外,本机部分没有收到任何数据! 如果有人可以提供帮助,那对我来说将是一个很大的帮助。 这是 MAinActivity.java:

 package com.alihaghighicapacitor.qom;
 import com.alihaghighicapacitor.qom.PluginTest2;
 import android.os.Bundle;

 import com.getcapacitor.BridgeActivity;
 import com.getcapacitor.Plugin;

 import java.util.ArrayList;

 public class MainActivity extends BridgeActivity {
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     // Initializes the Bridge
     this.init(savedInstanceState, new ArrayList<Class<? extends Plugin>>() {{
       // Additional plugins you've installed go here
       // Ex: add(TotallyAwesomePlugin.class);
       add(PluginTest2.class);

     }});
   }

 }
android ionic-framework startactivityforresult capacitor
3个回答
2
投票

要调用

handleOnActivityResult()
,您需要使用
@NativePlugin
注册您的意图请求代码。

@NativePlugin(
  requestCodes={MyPlugin.REQUEST_IMAGE_PICK}
)

意图与结果


1
投票

在返回愚蠢的数据之前,您必须使用

saveCall(call);
保存调用,否则savedCall将为空,并且它将转到空返回而不是处理返回数据的代码。


0
投票

我有类似的问题,但就我而言,回调函数是第二次触发的。 我正在调用

saveCall
函数,但结果仍然相同。

第一个活动开始时

callbackFunction
不会触发。但第二次启动就可以了。

这就是我开始活动并配置回调函数的方式。

    private void startSession(final PluginCall aCall) {
        Intent myChildView = new Intent(getContext(), MyChildView.class);
        ChildViewSettings childViewSettings = mapSettings(aCall);
        scanView.putExtra("settings", childViewSettings);
        bridge.saveCall(aCall);
        startActivityForResult(aCall, childViewSettings, "callbackFunciton");
    }

这是回调函数

    @ActivityCallback
    private void callbackFunciton(PluginCall call, ActivityResult result) {
        if (call == null) {
            return;
        }
        if (result.getResultCode() == Activity.RESULT_OK) {
            assert result.getData() != null;
            // processing callback data        
        }
    }

有什么想法为什么会发生这种情况吗?

© www.soinside.com 2019 - 2024. All rights reserved.