weex和Android的交互

本文主要探讨在项目中使用Weex进行开发时,如何实现Weex与Android原生代码的交互,包括Weex调用Android native方法以及设置事件监听。内容适合需要在Weex中进行Android交互的开发者。

项目需求用weex开发,所以写下希望对需要的人有所帮助吧

weex调用native的方法时


    @JSMethod(uiThread = true)
    public void printLog(String msg) {
        WXLogUtils.d("打印日志",msg);
    }

native传递参数给weex时

    @JSMethod(uiThread = false)
    public void toast(JSCallback callback, String msg) {
        Map map = new HashMap();
        map.put("data", msg);
        callback.invoke(map);
    }

native主动调用weex的方法现在还没有但是可以使用event解决:

   Map<String,Object> params=new HashMap<>();
            params.put("data",stringBuffer);
            mWXSDKInstance.fireGlobalEventCallback("phoneBookLocation",params);

我这边做了一个调用原生通讯录传个weex的Module:

public class PhoneBookModule extends WXModule {
    String stringBuffer = "";

    @JSMethod(uiThread = false)
    public void open() {
        ((Activity) (mWXSDKInstance.getContext())).startActivityForResult(new Intent(Intent.ACTION_PICK,
                ContactsContract.Contacts.CONTENT_URI),0);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0){

            ContentResolver reContentResolverol = mWXSDKInstance.getContext()
                    .getContentResolver();
            if(data==null){
                return;
            }
            Uri contactData = data.getData();
            @SuppressWarnings("deprecation")
            Cursor cursor = ((Activity)(mWXSDKInstance.getContext())).managedQuery(contactData, null, null,
                    null, null);
            if (cursor == null) {
                return;
            }
            cursor.moveToFirst();
            if (cursor.getCount() == 0) {
                Toast.makeText(mWXSDKInstance.getContext(),"您拒绝了访问通讯录,请设置访问权限!",Toast.LENGTH_SHORT).show();
                return;
            }
            String contactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = reContentResolverol.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
                            + contactId, null, null);
            ArrayList<String> contactList = new ArrayList<String>();
            while (phone.moveToNext()) {
                stringBuffer = phone
                        .getString(phone
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                stringBuffer = stringBuffer.replace("+86", "");
                stringBuffer = stringBuffer.replace(" ", "");
                stringBuffer = stringBuffer.replace("-", "");
                stringBuffer = stringBuffer.replace("——", "");
                contactList.add(stringBuffer);
            }
            if (null == contactList || 0 == contactList.size()) {
                Toast.makeText(mWXSDKInstance.getContext(), "该联系人没有可用手机号码!",
                        Toast.LENGTH_SHORT).show();
                return;
            }
            if (contactList.size() > 1) {
                final String[] contactArr = new String[contactList.size()];
                for (int i = 0; i < contactArr.length; i++) {
                    contactArr[i] = contactList.get(i);
                }
                new AlertDialog.Builder(mWXSDKInstance.getContext())
                        .setTitle("请选择充值号码")
                        .setSingleChoiceItems(contactArr, 0,
                                new DialogInterface.OnClickListener() {

                                    @Override
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        // TODO Auto-generated
                                        // method stub
                                        stringBuffer = contactArr[which];
                                        dialog.dismiss();
                                    }
                                }).show();
            } else {
                stringBuffer = contactList.get(0);
            }
            Map<String,Object> params=new HashMap<>();
            params.put("data",stringBuffer);
            mWXSDKInstance.fireGlobalEventCallback("phoneBookLocation",params);
        }
    }
}

weex调用native方法:

weex监听事件

var globalEvent = require('@weex-module/globalEvent');
globalEvent.addEventListener("phoneBookLocation", function (e) {
  console.log("get geolocation")
});


rk3588 下使用v4l2 采集摄像头,然后使用 mpp 压缩成 h264 最后用rtsp 输出流媒体,个人原创,学习v4l2, mpp 压缩, rtsp 流媒体可以参考学习,已工程使用,分辨率自动支持不完善,有时间再改优化在现代数字媒体处理领域,rk3588处理器由于其强大的性能高集成度,已成为众多开发者制造商的首选。rk3588是一块高性能的系统级芯片(SoC),广泛应用于智能电视、平板电脑、工业控制等多种场景。本项目主要探讨了如何在rk3588平台上,通过v4l2接口采集摄像头的图像数据,再利用MPP(Media Processing Platform,多媒体处理平台)将其压缩成h264格式的视频流,并最终通过RTSP(Real Time Streaming Protocol,实时流媒体传输协议)实现流媒体的输出。v4l2是Linux内核中用于视频输入输出的设备驱动架构,它是Video4Linux的第二版。v4l2提供了一套标准的编程接口,让应用程序能够访问控制摄像头等视频捕获设备。在这个项目中,v4l2的作用是作为视频数据采集的接口,把摄像头捕获到的原始图像数据读取出来。MPP是Rockchip公司为RK系列芯片开发的一套多媒体处理方案,它能在硬件层面上实现对多媒体数据的编解码处理。在本项目中,MPP的主要工作是接收来自v4l2的原始视频数据,并将这些数据压缩编码成h264格式。h264是一种广泛使用的视频压缩标准,具有高压缩比良好的视频质量,非常适合作为网络传输的视频格式。RTSP是一种网络控制协议,用来控制音频视频流的点播,允许像播放、暂停、停止等控制,因此它经常被用于流媒体服务中。项目最后通过RTSP协议输出压缩后的视频流,使用户可以通过网络实时观看视频内容。该工程的一个主要亮点是它支持自动分辨率调整。这意味着摄像头采集的视频数据可以自动适应不同的输出需求,无需手动设置,极大地方便了用户使用。然而,开发者也提到目前分辨率的自动支持还不完善,存在一些兼容性稳定性方面的问题,因此计划未来会进一步优化改进。整个项目是一个典型的多媒体数据处理流程,从视频数据的采集、处理到传输,覆盖了多媒体应用的多个关键环节。对于学习掌握v4l2、MPP压缩技术RTSP流媒体传输的开发者来说,该项目的代码工程实践可以提供非常宝贵的参考价值。同时,由于它已经应用于实际工程,因此项目的成熟度实用性也得到了验证。由于该项目还处于开发完善阶段,它也给开发者留下了一定的改进空间。例如,对分辨率自动支持的完善,以及可能的性能优化等,都是值得进一步研究的方向。对于那些希望在rk3588平台上开发流媒体服务的开发者来说,该项目无疑是一个非常值得研究的案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值