将 OnActivityResult 数据从电容器传回混合应用程序
Posted
技术标签:
【中文标题】将 OnActivityResult 数据从电容器传回混合应用程序【英文标题】:pass OnActivityResult data back to hybrid app from capacitor 【发布时间】:2019-05-31 17:12:39 【问题描述】:我正在开发 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 之外,本机部分没有收到任何数据! 如果 anyBody 可以提供帮助,那对我来说将是一个很大的帮助。 这是 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);
);
【问题讨论】:
意图意图 = new Intent();字符串消息 = editText.getText().toString(); intent.putExtra(“数据”,消息);开始活动(意图);完成(); 感谢您的回复!但没有 startActivity(intent) 单击按钮启动上一个活动。并添加您建议的代码会使应用程序崩溃。还是谢谢 ok,告诉我你的主要活动代码... 我添加了mainActivity.java 字符串名称 = getIntent().getStringExtra("DATA");这个使用主要活动 【参考方案1】:在您返回愚蠢的数据之前,您必须使用saveCall(call);
保存调用,否则savedCall 将为空,它将转到空返回而不是处理返回数据的代码。
【讨论】:
公平地说,他获得getSavedCall()
代码的文档页面似乎没有提到您必须首先在任何地方调用saveCall(call)
:capacitor.ionicframework.com/docs/plugins/android
你是对的,刚刚发送了一个 PR 来记录它github.com/ionic-team/capacitor/pull/1823【参考方案2】:
要调用handleOnActivityResult()
,您需要使用@NativePlugin
注册您的意图请求代码。
@NativePlugin(
requestCodes=MyPlugin.REQUEST_IMAGE_PICK
)
Intents with Result(s)
【讨论】:
以上是关于将 OnActivityResult 数据从电容器传回混合应用程序的主要内容,如果未能解决你的问题,请参考以下文章
从片段捕获图像时从不调用onActivityResult [重复]
Android Photo Gallery不会从OnActivityResult中的数据返回正确的Uri