GithubHelp home page GithubHelp logo

yxwandroid / flutter_plugin_record Goto Github PK

View Code? Open in Web Editor NEW
317.0 11.0 128.0 28.92 MB

flutter 仿微信录制语音功能 支持android和ios

License: Apache License 2.0

Kotlin 9.54% Ruby 1.72% Swift 0.24% Dart 88.51%
flutter-plugin android

flutter_plugin_record's Introduction

[TOC]

使用Flutter实现 仿微信录音的插件

插件支持android 和IOS


插件提供的功能 录制

  1. 录制语音,
  2. 播放录音,
  3. 录制声音大小的监听
  4. 提供录制时长的监听
  5. 提供类似微信的录制组件
  6. 提供播放音频结束的监听
  7. 提供根据传递的路径进行语音录制
  8. 提供录制wav,mp3格式 具体可参考example

播放

  1. 提供播放指定路径的音频文件
  2. 提供播放指定Url地址的wav,MP3格式文件
  3. 提供播放完成的回调监听
  4. 提供暂停和继续播放的功能
  5. 提供停止播放的功能

1,引入

在pubspec.yaml 文件上引入如下配置

引入方式1(引入最新的版本)
flutter_plugin_record:
    git:
      url: https://github.com/yxwandroid/flutter_plugin_record.git

引入方式2 (引入指定某次commit)
flutter_plugin_record:
    git:
      url: https://github.com/yxwandroid/flutter_plugin_record.git
      ref: 29c02b15835907879451ad9f8f88c357149c6085
      
引入方式3 (引入Flutter仓库的library)
      
dependencies:
  flutter_plugin_record: ^1.0.1

使用

1, 初始化录制

1.1, 初始化录制(wav)

可以在页面初始化的时候进行初始化比如: 在initState方法中进行初始化

//实例化对象 
FlutterPluginRecord   recordPlugin = new FlutterPluginRecord();
//    初始化
recordPlugin.init()

1.2, 初始化录制(Mp3)

可以在页面初始化的时候进行初始化比如: 在initState方法中进行初始化

//实例化对象 
FlutterPluginRecord   recordPlugin = new FlutterPluginRecord();
//    初始化
recordPlugin.initRecordMp3()

2, 开始录制

 recordPlugin.start()

3, 停止录制

 recordPlugin.stop()

4, 播放

1,播放

 recordPlugin.play()

2, 暂停和继续播放

 recordPlugin.pausePlay();

3, 停止播放

 recordPlugin.stopPlay();

5, 根据传递的路径进行语音录制

 recordPlugin.startByWavPath(wavPath);

6, 根据传递的路径或则Url进行语音播放

  ///
  /// 参数 path  播放音频的地址
  ///
  ///path 为 url类型对应的在线播放地址   https://linjuli-app-audio.oss-cn-hangzhou.aliyuncs.com/audio/50c39c768b534ce1ba25d837ed153824.wav
  ///path 对应本地文件路径对应的是本地文件播放肚子   /sdcard/flutterdemo/wiw.wav
  /// 参数  type
  /// 当path 为url   type为 url
  /// 当path 为本地地址 type为 file
  ///
  Future playByPath(String path, String type) async {
    return await _invokeMethod('playByPath', <String, String>{
      "play": "play",
      "path": path,
      "type": type,
    });
  }   

7, 释放资源

可以在页面退出的时候进行资源释放 比如在 dispose方法中调用如下代码

 recordPlugin.dispose()

4,回调监听

1,初始化回调监听

///初始化方法的监听
recordPlugin.responseFromInit.listen((data) {
  if (data) {
    print("初始化成功");
  } else {
    print("初始化失败");
  }
});

2,开始录制停止录制监听

 /// 开始录制或结束录制的监听
    recordPlugin.response.listen((data) {
      if (data.msg == "onStop") {
        ///结束录制时会返回录制文件的地址方便上传服务器
        print("onStop  " + data.path);
      } else if (data.msg == "onStart") {
        print("onStart --");
      }
    });

3,录制声音大小回调监听

 ///录制过程监听录制的声音的大小 方便做语音动画显示图片的样式
    recordPlugin.responseFromAmplitude.listen((data) {
      var voiceData = double.parse(data.msg);
      var tempVoice = "";
      if (voiceData > 0 && voiceData < 0.1) {
        tempVoice = "images/voice_volume_2.png";
      } else if (voiceData > 0.2 && voiceData < 0.3) {
        tempVoice = "images/voice_volume_3.png";
      } else if (voiceData > 0.3 && voiceData < 0.4) {
        tempVoice = "images/voice_volume_4.png";
      } else if (voiceData > 0.4 && voiceData < 0.5) {
        tempVoice = "images/voice_volume_5.png";
      } else if (voiceData > 0.5 && voiceData < 0.6) {
        tempVoice = "images/voice_volume_6.png";
      } else if (voiceData > 0.6 && voiceData < 0.7) {
        tempVoice = "images/voice_volume_7.png";
      } else if (voiceData > 0.7 && voiceData < 1) {
        tempVoice = "images/voice_volume_7.png";
      }
      setState(() {
        voiceIco = tempVoice;
        if(overlayEntry!=null){
          overlayEntry.markNeedsBuild();
        }
      });

      print("振幅大小   " + voiceData.toString() + "  " + voiceIco);
    });

4,播放声音完成的监听监听

  recordPlugin.responsePlayStateController.listen((data){
  print("播放路径   " + data.playPath );
  print("播放状态   " + data.playState );
});

2,录制组件的使用

组件使用效果

android效果

IOS效果

1,在使用的页面进行导入package

import 'package:flutter_plugin_record/index.dart';  

2,在使用的地方引入VoiceWidget组件

VoiceWidget(),


VoiceWidget({startRecord: Function, stopRecord: Function}) {

startRecord 开始录制的回调

stopRecord 停止录制的回调 返回的path是录制成功之后文件的保存地址

IOS配置注意事项

ios集成的的时候需要在info.list添加

 <key>NSMicrophoneUsageDescription</key>
        <string>打开话筒</string>


 <key>NSAppTransportSecurity</key>
 	<dict>
 		<key>NSAllowsArbitraryLoads</key>
 		<true/>
 	</dict>

ios release 打包失败配置注意事项

android配置注意事项

android 集成的的时候需要在application标签下添加

  tools:replace="android:label"

TODO

  • 双声道切换 单声道切换

感谢

肖中旺对IOS 播放在线Wav的支持

作者的其他开源项目推荐

基于腾讯云点播封装的flutter版的播放器插件

Flutter 二维码扫描插件

抖音开发平台SDK Flutter插件

FLutter地图插件

Flutter 模板工程

关注公众号获取更多内容

flutter_plugin_record's People

Contributors

ahyangnb avatar chenmengdi avatar iceinthefire avatar lijy91 avatar liweiwh avatar muhammedrefaat avatar muxi-xx avatar qianxuechao avatar xzw421771880 avatar yxwandroid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_plugin_record's Issues

初始化后报错

E/AndroidRuntime(29727): java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.thursday.lesbian/com.thursday.lesbian.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property _call has not been initialized
E/AndroidRuntime(29727): at android.app.ActivityThread.deliverResults(ActivityThread.java:4349)
E/AndroidRuntime(29727): at android.app.ActivityThread.handleSendResult(ActivityThread.java:4392)
E/AndroidRuntime(29727): at android.app.ActivityThread.-wrap22(ActivityThread.java)
E/AndroidRuntime(29727): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)
E/AndroidRuntime(29727): at android.os.Handler.dispatchMessage(Handler.java:105)
E/AndroidRuntime(29727): at android.os.Looper.loop(Looper.java:156)
E/AndroidRuntime(29727): at android.app.ActivityThread.main(ActivityThread.java:6623)
E/AndroidRuntime(29727): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(29727): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
E/AndroidRuntime(29727): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
E/AndroidRuntime(29727): Caused by: kotlin.UninitializedPropertyAccessException: lateinit property _call has not been initialized
E/AndroidRuntime(29727): at record.wilson.flutter.com.flutter_plugin_record.FlutterPluginRecordPlugin.initRecord(FlutterPluginRecordPlugin.kt:68)
E/AndroidRuntime(29727): at record.wilson.flutter.com.flutter_plugin_record.FlutterPluginRecordPlugin.onRequestPermissionsResult(FlutterPluginRecordPlugin.kt:232)
E/AndroidRuntime(29727): at io.flutter.embedding.engine.FlutterEnginePluginRegistry$FlutterEngineActivityPluginBinding.onRequestPermissionsResult(FlutterEnginePluginRegistry.java:612)
E/AndroidRuntime(29727): at io.flutter.embedding.engine.FlutterEnginePluginRegistry.onRequestPermissionsResult(FlutterEnginePluginRegistry.java:356)
E/AndroidRuntime(29727): at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onRequestPermissionsResult(FlutterActivityAndFragmentDelegate.java:509)
E/AndroidRuntime(29727): at io.flutter.embedding.android.FlutterActivity.onRequestPermissionsResult(FlutterActivity.java:611)
E/AndroidRuntime(29727): at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7340)
E/AndroidRuntime(29727): at android.app.Activity.dispatchActivityResult(Activity.java:7192)
E/AndroidRuntime(29727): at android.app.ActivityThread.deliverResults(ActivityThread.java:4345)
E/AndroidRuntime(29727): ... 9 more

希望能自定义获取权限

我看到了之前的版本的issue,但是在app进入的时候就申请本地录音和读写给人的印象会很差,希望能改成可选择的

[android]点击授权之后,出现闪退情况

具体错误:java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, reques t=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.xx.xx/com.xx.xx.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property _ca ll has not been initialized E/AndroidRuntime(23690): at android.app.ActivityThread.deliverResults(ActivityThread.java:4963) E/AndroidRuntime(23690): at android.app.ActivityThread.handleSendResult(ActivityThread.java:5004) E/AndroidRuntime(23690): at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) E/AndroidRuntime(23690): at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135 ) E/AndroidRuntime(23690): at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) E/AndroidRuntime(23690): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2049) E/AndroidRuntime(23690): at android.os.Handler.dispatchMessage(Handler.java:

播放语音功能需求

您好!请问可以提供语音播放的通知消息吗,类似您录制时的消息。
比如:成功,失败,完成。播放进度,停止播放,暂停播放。等等
这些都比较常用。

谢谢

一些建议

1.iOS 录音过短,原生代码报错,应该把异常抛出来
2.RecordResponse里面的msg这个不容易理解,建议用枚举,或者单独添加一个属性来说明,插件回调的状态

项目要求最低版本是16,插件要求最低是19,我改了插件版本放本地,还是报错。求楼主解答,感谢感谢

/Users/dongfang/Documents/isoftstone/gwadar-app/gwadarpro/android/app/src/main/AndroidManifest.xml Error:
uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [com.github.shaoshuai904:RecordWav:1.0.2] /Users/dongfang/.gradle/caches/transforms-2/files-2.1/a5c9de0c28bd84fc04e0951d313ffc99/RecordWav-1.0.2/AndroidManifest.xml as the library might be using APIs not available in 16
Suggestion: use a compatible library with a minSdk of at most 16,
or increase this project's minSdk version to at least 19,
or use tools:overrideLibrary="com.maple.recorder" to force usage (may lead to runtime failures)

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:processDebugManifest'.

Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [com.github.shaoshuai904:RecordWav:1.0.2] /Users/dongfang/.gradle/caches/transforms-2/files-2.1/a5c9de0c28bd84fc04e0951d313ffc99/RecordWav-1.0.2/AndroidManifest.xml as the library might be using APIs not available in 16
Suggestion: use a compatible library with a minSdk of at most 16,
or increase this project's minSdk version to at least 19,
or use tools:overrideLibrary="com.maple.recorder" to force usage (may lead to runtime failures)

引用0.1.4报错重复声明

e: C:\Users\Work\AppData\Roaming\Pub\Cache\git\flutter_plugin_record-ae140610102db968e5ae6c24e02c5fc43cf4009d\android\src\main\kotlin\record\wilson\flutter\com\flutter_plugin_record\FlutterPluginRecordPlugin.kt: (23, 7): Redeclaration: FlutterPluginRecordPlugin e: C:\Users\Work\AppData\Roaming\Pub\Cache\hosted\pub.flutter-io.cn\flutter_plugin_record-0.1.4\android\src\main\kotlin\record\wilson\flutter\com\flutter_plugin_record\FlutterPluginRecordPlugin.kt: (23, 7): Redeclaration: FlutterPluginRecordPlugin

permision denied

我引用了此插件,但是在进入页面的时候报permision denied,经检查,是manifest文件中的android.permission.RECORD_AUDIO权限没生效,请问一下这个应该怎么解决?

关于android的录音权限问题

能否去除android原生代码自带的权限判断...原生的太丑了,样式没有办法定义。
可否痛过别的组件使用,如permission_handler

recordPlugin.startByWavPath(wavPath)

recordPlugin.startByWavPath(wavPath):点击ListView中的item,在VoiceWidget中获取通知,更改录音的存储路径,录音结束后崩溃。(文件夹地址根据item index编号:wavPath = /var/mobile/Containers/Data/Application/461539D6-84B6-4E0F-848F-3B386DAB41BE/Documents/dubbing/1019/9682_1.wav)

//通知:
pathEventBus.on().listen((event) {
print('event.index = ${event.index}');
String wavPath = widget.filePath + '${widget.currentIndex}' +'.wav';
recordPlugin.startByWavPath(wavPath);
});

///初始化录音
recordPlugin = new FlutterPluginRecord();
_init();

//更换录音文件文件夹地址(ListView列表地址)
String wavPath = widget.filePath + '${widget.currentIndex}' +'.wav';
print('wavPath = $wavPath');
recordPlugin.startByWavPath(wavPath);

支持音频输入源,输出源切换吗

当我的手机连接了一个蓝牙耳机,
我想用蓝牙耳机的麦克风录音,用手机的扬声器播放,
或者用手机麦克风录音,在蓝牙耳机扬声器播放

监听播放音频结束

在未使用录音功能前,通过playByPath播发音频,音频可以正常播放,但无法监听到播放结束
D4948CA2-9245-4582-AC18-D5D7659DCE6A

exception

The following assertion was thrown building _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#283f9](dirty, state: _OverlayEntryState#1a945):
Looking up a deactivated widget's ancestor is unsafe.

At this point the state of the widget's element tree is no longer stable.

To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

长按录音申请权限问题

当长按录音时,会弹出授权框,点击同意后开始录音,但此时长按动作已经结束,不应该开始录音。

请升级一下kotlin插件版本,谢谢

FAILURE: Build failed with an exception.                                
                                                                        
* What went wrong:                                                      
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.10 and higher.
The following dependencies do not satisfy the required version:         
project ':flutter_plugin_record' -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.71

flutter build apk

registrar.activeContext() must not be null

因为要修改插件源码,所以直接把整个插件导入到工程的,但是会报错
Caused by: java.lang.IllegalStateException: registrar.activeContext() must not be null
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at record.wilson.flutter.com.flutter_plugin_record.FlutterPluginRecordPlugin$Companion.registerWith(FlutterPluginRecordPlugin.kt:36)
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at record.wilson.flutter.com.flutter_plugin_record.FlutterPluginRecordPlugin.registerWith(Unknown Source:2)
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:19)
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at com.example.im_kit.MainActivity.onCreate(MainActivity.kt:18)
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7802)
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7791)
07-15 15:48:29.321 25932 25932 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
请问这是registerWith方法flutter版本兼容问题么?

ANDROID上播放语音文件的问题

在运行时经常有这样的输出显示:

I/System (12185): FinalizerDaemon: finalize objects = 2
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released
W/MediaPlayer-JNI(12185): MediaPlayer finalized without being released

播放语音不能停止吗?

我看到了相关的issue,作者是不打算支持语音的停止与事件监听吗?

我想加个语音的播放停止与事件,能给个思路吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.