React Native封装Android原生UI和Android原生模块,并且集成腾讯云点播的Android SDK

前端之家收集整理的这篇文章主要介绍了React Native封装Android原生UI和Android原生模块,并且集成腾讯云点播的Android SDK前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

今天记录一下我的一个React Native Demo:

具体实现了对Android原生UI的封装和Android原生模块的封装,并且集成腾讯云点播的Android SDK。

功能:第一个页面显示腾讯云点播的视频播放控件,并播放一段视频。点击视频控件跳转到第二个页面


步骤:

一、创建React Native项目;

react-native init TestDemo

二、封装Android原生模块;

在TestDemo/android下创建一个GoToActivity.java文件,此类继承ReactContextBaseJavaModule,实现其中的方法

三、封装Android原生UI;

在TestDemo/android下创建一个自定义View,命名为CustomView;

再创建一个ReactCustomViewManager.java文件,此类继承SimpleViewManager<CustomView>,泛型是我上面自定义的View,目的就是封装这个自定义View,给React Native使用。

四、把写好的原生模块、原生UI进行注册

在TestDemo/android下创建一个MyReactPackage.java文件,此类继承ReactPackage,实现其中的方法,在createNativeModules方法注册原生模块,在createViewManagers方法注册原生UI。然后把MyReactPackage注册到MyApplication中getPackages方法中。

五、下载腾讯云点播Android SDK(下载地址:http://download-1252463788.cossh.myqcloud.com/RTMPSDKAndroid2.0.2.2801.zip);

将SDK的jniLibs文件夹拷贝到TestDemo/android/app/src/main/下;

导入jar包,在Android Studio工程中找到刚才的jniLibs目录,展开目录,可以看到txrtmpsdk.jar,点击右键选择“Add As Library...”;

在AndroidManifest.xml中配置APP的权限,音视频类APP一般需要以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.RECORD_AUdio" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.Camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />

六、在自定义View--CustomView的布局中加入腾讯云点播的播放控件com.tencent.rtmp.ui.TXCloudVideoView;

七、在JS端封装原生模块、原生UI,然后写一个页面进行测试。


代码如下:

MainActivity.java

  1. package com.yb;
  2.  
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6.  
  7. import com.facebook.react.ReactActivity;
  8.  
  9. import org.greenrobot.eventbus.EventBus;
  10. import org.greenrobot.eventbus.Subscribe;
  11. import org.greenrobot.eventbus.ThreadMode;
  12.  
  13. public class MainActivity extends ReactActivity {
  14.  
  15. /**
  16. * Returns the name of the main component registered from JavaScript.
  17. * This is used to schedule rendering of the component.
  18. */
  19. @Override
  20. protected String getMainComponentName() {
  21. return "yb";
  22. }
  23.  
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState)
  26. {
  27. super.onCreate(savedInstanceState);
  28. EventBus.getDefault().register(this);
  29. }
  30.  
  31. @Subscribe(threadMode = ThreadMode.MAIN)
  32. public void getMqttMessage(String mqttMessage) {
  33. Log.d("123pp",mqttMessage);
  34.  
  35. startActivity(new Intent(this,SecondActivity.class));
  36. }
  37.  
  38. @Override
  39. protected void onDestroy()
  40. {
  41. EventBus.getDefault().unregister(this);
  42. super.onDestroy();
  43. }
  44.  
  45. }

MainApplication.java

  1. package com.yb;
  2.  
  3. import android.app.Application;
  4.  
  5. import com.facebook.react.ReactApplication;
  6. import com.facebook.react.ReactNativeHost;
  7. import com.facebook.react.ReactPackage;
  8. import com.facebook.react.shell.MainReactPackage;
  9. import com.facebook.soloader.SoLoader;
  10.  
  11. import java.util.Arrays;
  12. import java.util.List;
  13.  
  14. public class MainApplication extends Application implements ReactApplication
  15. {
  16.  
  17. private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this)
  18. {
  19. @Override
  20. public boolean getUseDeveloperSupport()
  21. {
  22. return BuildConfig.DEBUG;
  23. }
  24.  
  25. @Override
  26. protected List<ReactPackage> getPackages()
  27. {
  28. return Arrays.<ReactPackage>asList(
  29. new MainReactPackage(),new MyReactPackage()
  30. );
  31. }
  32. };
  33.  
  34. @Override
  35. public ReactNativeHost getReactNativeHost()
  36. {
  37. return mReactNativeHost;
  38. }
  39.  
  40. @Override
  41. public void onCreate()
  42. {
  43. super.onCreate();
  44. SoLoader.init(this,/* native exopackage */ false);
  45. }
  46. }


GoToActivity.java

  1. package com.yb;
  2.  
  3. import com.facebook.react.ReactActivity;
  4.  
  5. import android.widget.Toast;
  6.  
  7. import com.facebook.react.bridge.NativeModule;
  8. import com.facebook.react.bridge.ReactApplicationContext;
  9. import com.facebook.react.bridge.ReactContext;
  10. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  11. import com.facebook.react.bridge.ReactMethod;
  12.  
  13. import org.greenrobot.eventbus.EventBus;
  14.  
  15. import java.util.Map;
  16. import java.util.HashMap;
  17.  
  18. public class GoToActivity extends ReactContextBaseJavaModule
  19. {
  20.  
  21. private static final String DURATION_SHORT_KEY = "SHORT";
  22. private static final String DURATION_LONG_KEY = "LONG";
  23.  
  24. public GoToActivity(ReactApplicationContext reactContext)
  25. {
  26. super(reactContext);
  27. }
  28.  
  29. /**
  30. * getName方法。这个函数用于返回一个字符串名字,就是js中的模块名
  31. */
  32. @Override
  33. public String getName()
  34. {
  35. return "GoToActivity";
  36. }
  37.  
  38. /**
  39. * 返回了需要导出给JavaScript使用的常量
  40. */
  41. @Override
  42. public Map<String,Object> getConstants()
  43. {
  44. final Map<String,Object> constants = new HashMap<>();
  45. constants.put(DURATION_SHORT_KEY,Toast.LENGTH_SHORT);
  46. constants.put(DURATION_LONG_KEY,Toast.LENGTH_LONG);
  47. return constants;
  48. }
  49.  
  50. /**
  51. * 导出给js使用的方法,需要使用注解@ReactMethod。方法的返回类型必须为void
  52. */
  53. @ReactMethod
  54. public void show(String message,int duration)
  55. {
  56. Toast.makeText(getReactApplicationContext(),message,duration).show();
  57. EventBus.getDefault().post(message);
  58. }
  59. }


CustomView.java

  1. package com.yb;
  2.  
  3. import android.content.Context;
  4. import android.graphics.Color;
  5. import android.util.AttributeSet;
  6. import android.view.LayoutInflater;
  7. import android.widget.RelativeLayout;
  8. import android.widget.TextView;
  9.  
  10. import com.tencent.rtmp.ui.TXCloudVideoView;
  11.  
  12. /**
  13. * Created by Auser on 2017/5/2.
  14. */
  15. public class CustomView extends RelativeLayout
  16. {
  17. private TextView textView;
  18. private TXCloudVideoView txCloudVideoView;
  19.  
  20. public CustomView(Context context)
  21. {
  22. super(context);
  23. init(context);
  24. }
  25.  
  26. public CustomView(Context context,AttributeSet attrs)
  27. {
  28. super(context,attrs);
  29. init(context);
  30. }
  31.  
  32. public CustomView(Context context,AttributeSet attrs,int defStyleAttr)
  33. {
  34. super(context,attrs,defStyleAttr);
  35. init(context);
  36. }
  37.  
  38. private void init(Context context) {
  39. LayoutInflater.from(context).inflate(R.layout.customview_layout,this,true);
  40. textView = (TextView) this.findViewById(R.id.tv01);
  41. textView.setText("我是一个CustomView");
  42. textView.setTextColor(Color.parseColor("#ff0000"));
  43.  
  44. txCloudVideoView = (TXCloudVideoView) this.findViewById(R.id.video_view);
  45. }
  46.  
  47. public void setText(String txt) {
  48. this.textView.setText(txt);
  49. }
  50.  
  51. public String getText() {
  52. return this.textView.getText().toString();
  53. }
  54.  
  55. public TXCloudVideoView getTxCloudVideoView()
  56. {
  57. return txCloudVideoView;
  58. }
  59.  
  60. public void setTxCloudVideoView(TXCloudVideoView txCloudVideoView)
  61. {
  62. this.txCloudVideoView = txCloudVideoView;
  63. }
  64. }


MyReactPackage.java

  1. package com.yb;
  2.  
  3. import com.facebook.react.bridge.NativeModule;
  4. import com.facebook.react.bridge.ReactApplicationContext;
  5. import com.facebook.react.ReactPackage;
  6. import com.facebook.react.bridge.JavaScriptModule;
  7. import com.facebook.react.uimanager.ViewManager;
  8.  
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. import java.util.Collections;
  13.  
  14. public class MyReactPackage implements ReactPackage
  15. {
  16.  
  17. @Override
  18. public List<NativeModule> createNativeModules(
  19. ReactApplicationContext reactContext)
  20. {
  21. List<NativeModule> modules = new ArrayList<>();
  22.  
  23. modules.add(new GoToActivity(reactContext));
  24.  
  25. return modules;
  26. }
  27.  
  28. @Override
  29. public List<Class<? extends JavaScriptModule>> createJSModules()
  30. {
  31. // TODO Auto-generated method stub
  32. return Collections.emptyList();
  33. }
  34.  
  35. @Override
  36. public List<ViewManager> createViewManagers(
  37. ReactApplicationContext reactContext)
  38. {
  39. return Arrays.<ViewManager>asList(
  40. new ReactCustomViewManager()
  41. );
  42. }
  43.  
  44. }


ReactCustomViewManager.java

  1. package com.yb;
  2.  
  3.  
  4. import android.support.annotation.Nullable;
  5. import android.util.Log;
  6. import android.webkit.WebView;
  7. import android.webkit.WebViewClient;
  8.  
  9. import com.facebook.react.uimanager.SimpleViewManager;
  10. import com.facebook.react.uimanager.ThemedReactContext;
  11. import com.facebook.react.uimanager.annotations.ReactProp;
  12. import com.tencent.rtmp.TXLivePlayer;
  13.  
  14. /**
  15. * Created by YiBing on 2017/4/28.
  16. */
  17. public class ReactCustomViewManager extends SimpleViewManager<CustomView>
  18. {
  19. ThemedReactContext context;
  20.  
  21. public static final String REACT_CLASS = "RCTCustomView";
  22. @Override
  23. public String getName() {
  24. return REACT_CLASS;
  25. }
  26.  
  27. @Override
  28. protected CustomView createViewInstance(ThemedReactContext reactContext) {
  29. this.context = reactContext;
  30. CustomView customView = new CustomView(reactContext);
  31. return customView;
  32. }
  33.  
  34. @ReactProp(name = "url")
  35. public void setUrl(CustomView customView,@Nullable String url) {
  36. Log.e("TAG","setUrl");
  37. customView.setText(url);
  38.  
  39. TXLivePlayer txLivePlayer = new TXLivePlayer(context);
  40. txLivePlayer.setPlayerView(customView.getTxCloudVideoView());
  41. txLivePlayer.startPlay(url,TXLivePlayer.PLAY_TYPE_VOD_MP4);
  42. }
  43. }


SecondActivity.java

  1. package com.yb;
  2.  
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5.  
  6. import com.tencent.rtmp.ui.TXCloudVideoView;
  7. import com.tencent.rtmp.TXLivePlayer;
  8.  
  9. public class SecondActivity extends AppCompatActivity
  10. {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState)
  13. {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_second);
  16. }
  17. }


activity_second.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6.  
  7. <TextView
  8. android:id="@+id/tv01"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:text="Second Activity"
  12. android:gravity="center_horizontal"/>
  13.  
  14. </RelativeLayout>


customview_layout.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content">
  6.  
  7. <TextView
  8. android:id="@+id/tv01"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:text="Hello world!"
  12. android:gravity="center_horizontal"/>
  13.  
  14. <com.tencent.rtmp.ui.TXCloudVideoView
  15. android:id="@+id/video_view"
  16. android:layout_below="@id/tv01"
  17. android:layout_marginTop="8dp"
  18. android:layout_width="match_parent"
  19. android:layout_height="300dp"
  20. android:layout_centerInParent="true"
  21. android:visibility="gone"/>
  22.  
  23. </RelativeLayout>


CustomView.js

  1. /**
  2. * Created by YiBing on 2017/4/28.
  3. * react-native: 0.43.3
  4. * react-native-cli: 2.0.1
  5. */
  6.  
  7. import { PropTypes } from 'react';
  8. import { requireNativeComponent,View } from 'react-native';
  9.  
  10. var iface = {
  11. name: 'CustomView',propTypes: {
  12. url: PropTypes.string,...View.propTypes // include the default view properties
  13. },};
  14.  
  15. module.exports = requireNativeComponent('RCTCustomView',iface);


GoToActivity.js

  1. /**
  2. * Created by YiBing on 2017/4/28.
  3. */
  4.  
  5. 'use strict';
  6.  
  7. import {
  8. NativeModules
  9. } from 'react-native';
  10.  
  11. export default NativeModules.GoToActivity;
  12.  
  13. // 以前的ES版本的写法。
  14. // var {NativeModules} = require('react-native');
  15. // module.exports = NativeModules.MyToast;
  16.  
  17.  
  18.  


index.android.js

  1. import React,{ Component } from 'react';
  2. import {
  3. AppRegistry,StyleSheet,Text,View,ListView,TouchableOpacity,Image,ToastAndroid,} from 'react-native';
  4.  
  5. import GoToActivity from './GoToActivity';
  6. import CustomView from './CustomView';
  7.  
  8. var video_url = "http://www.zxx.net.cn:8080//dmmm/vedio/201612270541078235250/201612270541078235250.mp4";
  9.  
  10. export default class yb extends Component {
  11. render() {
  12. return (
  13. <View style={styles.container}>
  14. <View style={{width:'100%',height:50,borderWidth:2,borderColor:'#f00',justifyContent:'center',alignItems:'center',}}>
  15. <Text style={{textAlign:'center',}}>腾讯云点播测试</Text>
  16. </View>
  17. <TouchableOpacity
  18. onPress={() => GoToActivity.show("Go To SecondActivity",ToastAndroid.SHORT)}
  19. style={{width:'100%',flex:1,borderWidth:10,borderColor:'#00f'}}>
  20. <CustomView
  21. url={video_url}
  22. style={{width:'100%',height:'100%'}} />
  23.  
  24. </TouchableOpacity>
  25. </View>
  26. );
  27. }
  28. }
  29.  
  30. const styles = StyleSheet.create({
  31. container: {
  32. flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',},welcome: {
  33. fontSize: 20,textAlign: 'center',margin: 10,instructions: {
  34. textAlign: 'center',color: '#333333',marginBottom: 5,});
  35.  
  36. AppRegistry.registerComponent('yb',() => yb);


程序显示效果图:

猜你在找的React相关文章