四、项目分析

一、App功能介绍:

这个项目的主要功能有:注册、登录、发送验证码、修改用户头像、修改用户信息、调起相机录制或者调起相册选择和上传视频、调起设备的录音功能录制音频、合并音频和视频并生成一个配音的视频、将生成好的视频同步到云端、视频列表页面、视频详情页面可以播放视频、可以对视频进行评论点赞等操作。
具体演示:

多图预警!流量党请谨慎点开!!!

1、初次安装的话,会进入一个轮播图的页面,用来介绍项目的功能


点击“马上体验”按钮进入登录页


2、登录流程

点击“获取验证码”按钮获取验证码



由于短信的服务是付费的,因此为了节约学习成本,就在后台直接返回给前端验证码的信息。
输入验证码后,点击登录,进入App首页


3、查看已经上传的视频

首页是上传过的视频列表,可以点击“喜欢”进行点赞,也可以再次点击取消点赞功能



点击视频进入视频详情页



可以暂停视频的播放,也可以继续。
点击评论框可以对当前视频进行评论:


评论结果会显示在视频详情页下方。

4、生成视频模块

点击下方中间按钮可以进入视频制作页面:


点击“点我上传视频”调出imagePicker插件,可以选择从相册中选择已有视频、也可以直接调用camera现场录制视频:



由于模拟器中没有相机功能,因此无法演示,我们只演示一下“选择已有视频”的流程,点击选择已有视频后,需要调用相册的权限,会事先询问一下,在这里选择OK就行了。




进入到相册后,选择一个视频,点击choose进行压缩上传:

上传视频完成后,进入配音页面



点击中间的麦克风按钮,开始给当前视频配音

录音完成,点击下一步设置视频标题

点击“发布视频”,发布当前视频创意。
image.png

发布成功后,会提示“视频发布成功”,此时,在视频列表页就会多出一条视频,且可以点击进入详情页进行播放。



5、个人账户模块

点击右侧按钮进入“我的账户”页面


点击上方“戳这里换头像”区域,可以调起imagePicker模块,拍摄照片或者从相册中选取图片进行更换头像的操作(具体流程与上传视频类似):


点击右上方编辑按钮,可以进入编辑页面,设置当前用户的信息



点击“退出登录”,可以退回到登录页面。
以上就是对这个项目功能方面的总体描述。

二、项目代码及目录结构:

代码目录结构

如上图所示,RN项目有android、ios两个文件夹,这两个文件夹放的是原生的代码,除非要引用一些额外的插件,否则我们在开发业务的过程中不要对它们做过多的修改,以免出现问题。
node_modules文件夹是项目所安装的npm依赖
index.js是项目的入口文件
App.js是项目的首页
其中index.js在旧版本的RN框架中是分为index.ios.js、index.android.js两个文件,目前在0.51版本的react-native框架下合并成了index.js。
app文件夹中放的则是该项目的核心业务代码。
下面重点介绍一下app文件夹中的内容:


app文件夹中存放了数个文件夹。
account文件夹存放的是“个人账户页面”、“登录页面”、“初始滑动页面”三个模块
assets文件夹中存放的是项目的静态资源,这里主要是一些图片
common文件夹中的是当前项目的公用函数或者配置文件
creation文件夹存放的是当前项目的“视频列表”和“视频详情”页面
edit文件夹存放的是当前项目的“生成视频”模块


三、具体功能的实现方式

1、初次打开时的轮播图组件的实现:

轮播组件是在初次进入APP时显示的几张轮播引导图,只在安装后第一次打开App时显示,第二次打开就不会再显示了。

当应用初次打开时,进入App.js页面,页面的状态中有一个entered属性,初始的时候,它为false,所以此时默认将Slider渲染出来。

当点击“马上体验”之后,将其设置为true,并且设置持久存储:AsyncStorage.setItem('entered', 'yes') 。此时Slider消失,将App主页显示出来。

当下次再进入页面的时候,先判断AsyncStorage里面的entered字段是不是为“yes”,如果是的话就设置当前state中的entered为true,显示App主页。

轮播图组件应用了react-native-swiper插件,具体插件的用法可以在https://js.coach中查询

2、react-navigation插件的使用

该项目的视频列表页进入视频详情页这一过程使用了react-navigation这个插件。
老版本的react-native的官方插件是:React.Navigator,目前这个插件已经被废弃了,官方目前推荐使用react-navigation插件。
安装

yarn add react-navigation
//或者
npm install --save react-navigation

官方文档
使用demo:

class HomeScreen extends React.Component {
  static navigationOptions = ({ navigation }) => {
    const params = navigation.state.params || {};

    return {
      headerLeft: (
        <Button
          onPress={() => navigation.navigate('MyModal')}
          title="Info"
          color="#fff"
        />
      ),
      /* the rest of this config is unchanged */
    };
  };

  /* render function, etc */
}

class ModalScreen extends React.Component {
  render() {
    return (
      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <Text style={{ fontSize: 30 }}>This is a modal!</Text>
        <Button
          onPress={() => this.props.navigation.goBack()}
          title="Dismiss"
        />
      </View>
    );
  }
}

const MainStack = StackNavigator(
  {
    Home: {
      screen: HomeScreen,
    },
    Details: {
      screen: DetailsScreen,
    },
  },
  {
    /* Same configuration as before */
  }
);

const RootStack = StackNavigator(
  {
    Main: {
      screen: MainStack,
    },
    MyModal: {
      screen: ModalScreen,
    },
  },
  {
    mode: 'modal',
    headerMode: 'none',
  }
);



3、react-native-image-picker插件的使用

当我们需要调起设备的相册选取相册或者视频时,当我们需要调起相机拍照或者录制视频时需要用到这一插件。


插件官方地址:react-native-image-picker
插件的安装:npm install react-native-image-picker@latest --save
由于该插件需要引用原生的一些东西,所以需要:react-native link
做完以上工作还需要进行手动配置:
ios:
1、In the XCode's "Project navigator", right click on your project's Libraries folder ➜ Add Files to <...>
2、Go to node_modules ➜ react-native-image-picker ➜ ios ➜ select RNImagePicker.xcodeproj
3、Add RNImagePicker.a to Build Phases -> Link Binary With Libraries
4、For iOS 10+, Add the NSPhotoLibraryUsageDescription, NSCameraUsageDescription, NSPhotoLibraryAddUsageDescription and NSMicrophoneUsageDescription (if allowing video) keys to your Info.plist with strings describing why your app needs these permissions. Note: You will get a SIGABRT crash if you don't complete this step

  <dict>
    ...
    <key>NSPhotoLibraryUsageDescription</key>
    <string>$(PRODUCT_NAME) would like access to your photo gallery</string>
    <key>NSCameraUsageDescription</key>
    <string>$(PRODUCT_NAME) would like to use your camera</string>
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>$(PRODUCT_NAME) would like to save photos to your photo gallery</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>$(PRODUCT_NAME) would like to your microphone (for videos)</string>
  </dict>
</plist>



android
Add the following lines to android/settings.gradle:

include ':react-native-image-picker'
project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android')

Update the android build tools version to 2.2.+ in android/build.gradle:

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.+' // <- USE 2.2.+ version
    }
    ...
}
...

Update the gradle version to 2.14.1 in android/gradle/wrapper/gradle-wrapper.properties:

...
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
Add the compile line to the dependencies in android/app/build.gradle:

dependencies {
    compile project(':react-native-image-picker')
}

Add the required permissions in AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Add the import and link the package in MainApplication.java:

import com.imagepicker.ImagePickerPackage; // <-- add this import

public class MainApplication extends Application implements ReactApplication {
    @Override
    protected List<ReactPackage> getPackages() {
        return Arrays.<ReactPackage>asList(
            new MainReactPackage(),
            new ImagePickerPackage() // <-- add this line
            // OR if you want to customize dialog style
            new ImagePickerPackage(R.style.my_dialog_style)
        );
    }
}

使用方法:

var ImagePicker = require('react-native-image-picker');

// More info on all the options is below in the README...just some common use cases shown here
var options = {
  title: 'Select Avatar',
  customButtons: [
    {name: 'fb', title: 'Choose Photo from Facebook'},
  ],
  storageOptions: {
    skipBackup: true,
    path: 'images'
  }
};

/**
 * The first arg is the options object for customization (it can also be null or omitted for default options),
 * The second arg is the callback which sends object: response (more info below in README)
 */
ImagePicker.showImagePicker(options, (response) => {
  console.log('Response = ', response);

  if (response.didCancel) {
    console.log('User cancelled image picker');
  }
  else if (response.error) {
    console.log('ImagePicker Error: ', response.error);
  }
  else if (response.customButton) {
    console.log('User tapped custom button: ', response.customButton);
  }
  else {
    let source = { uri: response.uri };

    // You can also display the image using data:
    // let source = { uri: 'data:image/jpeg;base64,' + response.data };

    this.setState({
      avatarSource: source
    });
  }
});

Then later, if you want to display this image in your render() method:

<Image source={this.state.avatarSource} style={styles.uploadAvatar} />

To Launch the Camera or Image Library directly (skipping the alert dialog) you can do the following:

// Launch Camera:
ImagePicker.launchCamera(options, (response)  => {
  // Same code as in above section!
});

// Open Image Library:
ImagePicker.launchImageLibrary(options, (response)  => {
  // Same code as in above section!
});



4、react-native-audio插件的使用

破坏性升级:
For React Native >= 0.47.2, use v3.4.0 and up.
For React Native >= 0.40, use v3.1.0 up til 3.2.2.
For React Native <= 0.39, use v3.0.0 or lower.

v4.0 introduced a breaking change to the API to introduce distinct pause and resume methods.

v3.x removed playback support in favor of using more mature libraries like react-native-sound. If you need to play from the network, please submit a PR to that project or try react-native-video.

安装:

npm install react-native-audio --save
react-native link react-native-audio

在iOS中需要对Info.plist中增加对麦克风的允许:

<key>NSMicrophoneUsageDescription</key>
<string>This sample uses the microphone to record your speech and convert it to text.</string>

在Android中需要在 AndroidManifest.xml中:

<uses-permission android:name="android.permission.RECORD_AUDIO" />



手动安装:
如果你使用了 react-native link就不需要做以下配置了

Edit android/settings.gradle to declare the project directory:

include ':react-native-audio'
project(':react-native-audio').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-audio/android')

Edit android/app/build.gradle to declare the project dependency:

dependencies {
  ...
  compile project(':react-native-audio')
}

Edit android/app/src/main/java/.../MainApplication.java to register the native module:

import com.rnim.rn.audio.ReactNativeAudioPackage; // <-- New
...

public class MainApplication extends Application implements ReactApplication {
  ...
  @Override
  protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        new ReactNativeAudioPackage() // <-- New
    );
  }



使用:

import {AudioRecorder, AudioUtils} from 'react-native-audio';
let audioPath = AudioUtils.DocumentDirectoryPath + '/test.aac';

AudioRecorder.prepareRecordingAtPath(audioPath, {
  SampleRate: 22050,
  Channels: 1,
  AudioQuality: "Low",
  AudioEncoding: "aac"
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,052评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,090评论 4 62
  • 十一月的天已是格外冷了,屋内的光还是那么的柔和,让寒冷的秋冬交际之时凉意渐渐的稀释了些许。 还是得像往常天一样...
    浅黛梨妆秋阅读 222评论 0 0
  • 《笑乐汇》栏目第三季合作的媒体有CCTV—发现之旅、江华本山(国际)传媒、江华文化传播有限公司、映客直播、陌陌直播...
    83fc7045ded4阅读 458评论 0 0
  • 半年没露面的小妖精突然冒出来,说,假还没有放够就又回来上班,假期比去年短了足足一个多星期,不开森。我说,不开森的话...
    取个帅气的昵称有啥用呢阅读 148评论 3 1