cocos游戏需要获取安卓原生现在登录的用户信息,需要安卓给他发信息。最简单的方法是cocos就是个单独的游戏,进去之后要重新登录一下,登录用的账号密码还是安卓里面的,用的一个数据库,这样数据也是同步的,但是进入游戏还要登录,感觉用户体验不好,于是想办法把安卓的数据传递到cocos里。
一种是cocos打包为原生安卓,一种是打包为web-mobile,用WebView显示,我不太想打包为原生安卓,因为编译非常慢
于是采用web-mobile
使用了这个方法
https://www.jianshu.com/p/3cb256de46d3
cocos 代码
export class Bus {
static curUser = null
static putCurUser (window) {
if (window.androidObject && window.androidObject.getCurUser) {
// Comm
// Bus.curUser=User.achievementId
// cc.log("Bus.curUser getCurUser have ")
// // 直接拿来字符串可以赋值吗? 就是赋值了一个字符串是吧。。
// Bus.curUser= window.androidObject.getCurUser()
// cc.log("Bus.curUser ",Bus.curUser)
// cocos 弹窗
// Comm
// Bus.curUser=User.achievementId
// 可以
// 游戏界面就没有 Bus 了 因为没有import 呀
cc.log("Bus.curUser getCurUser have ")
// 直接传递一个java对象应该是不行的,传递json字符串吧
var userStr = window.androidObject.getCurUser()
Bus.curUser = JSON.parse(userStr)
// Bus
// Bus
// Bus.curUser= window.androidObject.getCurUser()
cc.log("Bus.curUser ", Bus.curUser)
// cocos 弹窗
// this.createAlert(1,1,JSON.stringify(Bus.curUser))
}
}
}
安卓
package com.example.whatrubbish.fragment;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.example.whatrubbish.Bus;
import com.example.whatrubbish.databinding.FragmentWebBinding;
import com.example.whatrubbish.entity.User;
import com.example.whatrubbish.ui.notifications.NotificationsViewModel;
/**
* 天上掉下垃圾的游戏
*/
public class SplitDropRubFragment extends Fragment {
private NotificationsViewModel notificationsViewModel;
private FragmentWebBinding binding;
public SplitDropRubFragment(String url) {
this.url = url;
}
String url;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
notificationsViewModel =
new ViewModelProvider(this).get(NotificationsViewModel.class);
binding = FragmentWebBinding.inflate(inflater, container, false);
View root = binding.getRoot();
final TextView textView = binding.textNotifications;
notificationsViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);
initWeb();
return root;
}
//@SuppressLint("JavascriptInterface")
void initWeb() {
WebView webview= binding.Toweb;
webview.loadUrl(url);
//1,js调用安卓
webview.getSettings().setJavaScriptEnabled(true);//这里必须开启
//把当前JavaH5Activity对象作为androidObject别名传递给js
//js通过window.androidObject.androidMethod()就可以直接调用安卓的androidMethod方法
webview.addJavascriptInterface(this, "androidObject");
}
//应该不能直接传递一个 java的类吧
//js调用安卓,必须加@JavascriptInterface注释的方法才可以被js调用
@JavascriptInterface
public String getCurUser() {
Log.i("qcl0228", "js调用了安卓的方法");
String json = Bus.gson.toJson(Bus.curUser);
//return Bus.curUser;
Log.i("json", "getCurUser: "+json);
return json;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
一开始还在想,打包成html他是放在canvas里面,我数据是传到windows里面的,怎么给他传到canvas里面去呢,还以为没有可行性。后来想通了,我是在cocos的代码里直接调用windows这个对象,在那个代码里,这个对象我是拿得到的,拿到了就都可以用了