Android应用中实现声音传输与数据库的数据存储 (android 声音传输数据库)

在现代社会中,移动应用的开发和使用越来越普遍。针对一些特定应用场景的需求,应用程序开发者需要实现一些新颖的功能。本文将介绍如何在Android应用程序中实现声音传输和使用数据库存储数据的方法。

一、声音传输

声音传输可以用于建立两个或多个用户之间的语音通信。一种流行的实现方式是使用网络连接。这里我们将介绍如何使用Android SDK来实现基于网络的声音传输。

步骤1:创建Android应用程序

首先我们需要创建一个Android应用程序,用于实现声音传输功能。打开Android Studio并创建一个新项目。我们将会使用Java语言来编写应用程序。

步骤2:添加网络通信支持

现在我们需要添加网络通信功能。在Android应用中,我们可以使用Socket API来实现网络通信。选择“File” > “New” > “Java Class”来创建新的Java类。在新建的Java类中添加下列代码:

“`java

import java.io.IOException;

import java.net.Socket;

public class NetworkCommunication {

private Socket socket;

private static final String SERVER_ADDRESS = “192.168.0.1”;

private static final int SERVER_PORT = 5000;

public NetworkCommunication() throws IOException {

socket = new Socket(SERVER_ADDRESS, SERVER_PORT);

}

}

“`

在以上代码中,我们创建了一个名为NetworkCommunication的类,用于管理网络通信。在构造函数中,我们创建了一个新的Socket实例,并连接到服务器地址“192.168.0.1”以及端口号5000。这些值应该根据具体需求做出修改。

步骤3:录制和播放声音

现在我们可以开始录制声音并将其传输到远程服务器。我们可以使用Android SDK提供的MediaRecorder类来实现录音功能。选择“File” > “New” > “Java Class”来创建另一个Java类。在新的Java类中添加下列代码:

“`java

import android.media.MediaRecorder;

import java.io.IOException;

public class AudioRecorder {

private MediaRecorder recorder;

public AudioRecorder() throws IOException {

recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

recorder.setOutputFile(“/dev/null”);

recorder.prepare();

recorder.start();

}

public void stop() {

recorder.stop();

recorder.release();

}

}

“`

在以上代码中,我们创建了一个名为AudioRecorder的类来实现录音功能。在构造函数中,我们创建了一个新的MediaRecorder实例并设置了音频源、输出格式、音频编码器以及输出文件路径。录音会被保存到一个“/dev/null”路径下的虚拟文件中。录音保存在虚拟文件中是因为我们要对录音进行内存缓存,而不是将其保存到磁盘上。

现在我们可以调用AudioRecorder.stop()方法来停止录音。录音被停止后,我们可以将其发送到远程服务器,代码如下:

“`java

import java.io.IOException;

import java.io.OutputStream;

public class AudioSender {

private OutputStream outputStream;

public AudioSender(Socket socket) throws IOException {

outputStream = socket.getOutputStream();

}

public void send(byte[] data) throws IOException {

outputStream.write(data);

}

}

“`

在以上代码中,我们创建了一个名为AudioSender的类来发送录音数据。在构造函数中,我们获取了网络通信类的输出流。调用send方法将录音数据作为参数发送给远程服务器。当我们需要发送录音数据时,调用AudioSender.send(byte[] data)方法。

步骤4:接收和播放远程声音

现在我们可以开始接收远程服务器发送的声音。我们可以使用Android SDK提供的AudioTrack类来实现播放功能。选择“File” > “New” > “Java Class”来创建另一个Java类。在新的Java类中添加下列代码:

“`java

import android.media.AudioTrack;

import java.io.IOException;

import java.io.InputStream;

public class AudioPlayer {

private AudioTrack audioTrack;

private byte[] audioData;

public void play(InputStream inputStream) throws IOException {

audioData = new byte[4096];

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,

8000,

AudioFormat.CHANNEL_OUT_MONO,

AudioFormat.ENCODING_PCM_16BIT,

audioData.length,

AudioTrack.MODE_STREAM

);

audioTrack.play();

while (true) {

int readBytes = inputStream.read(audioData);

if (readBytes == -1) {

break;

}

audioTrack.write(audioData, 0, readBytes);

}

}

public void stop() {

audioTrack.stop();

audioTrack.release();

}

}

“`

在以上代码中,我们创建了一个名为AudioPlayer的类来实现播放远程声音数据的功能。在play方法中,我们创建了一个新的AudioTrack实例并将其设置为流媒体音乐,使用Mono声道、16位PCM编码和8000Hz的采样率。声音数据将被保存在audioData数组中。调用AudioPlayer.play(InputStream inputStream)方法并将从网络通信类中获取的输入流作为参数传入。当我们需要停止播放时,调用AudioPlayer.stop()方法。

二、数据库数据存储

大多数应用程序需要使用一些数据来完成其功能。为了存储这些数据,我们可以使用Android应用程序的内置数据存储方式。Android应用程序内置SQLite数据库引擎,我们可以使用其API来操作数据。

步骤1:创建Android应用程序

首先我们需要创建一个Android应用程序,用于实现数据存储功能。打开Android Studio并创建一个新项目。我们将会使用Java语言来编写应用程序。

步骤2:创建数据库

我们将在这个应用程序中使用SQLite数据库来存储数据。选择“File” > “New” > “Java Class”来创建一个名为“DatabaseHelper”的Java类,并在其中添加下列代码:

“`java

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = “mydatabase.db”;

private static final int DATABASE_VERSION = 1;

public DatabaseHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(“CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);”);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(“DROP TABLE IF EXISTS mytable;”);

onCreate(db);

}

}

“`

在以上代码中,我们创建了一个名为DatabaseHelper的类,用于管理SQLite数据库。在构造函数中,我们指定了数据库名称和版本号。在onCreate方法中,我们创建了一个名为“mytable”的表。该表包含一个自增长的id列和一个name列。使用该类创建数据库并在其中创建mytable表的代码如下:

“`java

DatabaseHelper databaseHelper = new DatabaseHelper(this);

SQLiteDatabase database = databaseHelper.getWritableDatabase();

“`

以上代码将创建一个名为“mydatabase.db”的数据库和一个名为“mytable”的表。现在我们可以向该表中添加数据。

步骤3:向数据库添加数据

我们可以使用SQLiteDatabase类的insert方法将数据添加到mytable表中。代码实例如下:

“`java

ContentValues values = new ContentValues();

values.put(“name”, “张三”);

database.insert(“mytable”, null, values);

“`

在以上代码中,我们使用ContentValues类来存储数据。调用SQLiteDatabase.insert方法并将表名和ContentValues对象作为参数传入。通过这种方式,我们可以向数据库中添加任意数量的数据。

步骤4:从数据库中读取数据

我们可以使用SQLiteDatabase类的query方法从mytable表中读取数据,代码实例如下:

“`java

String[] projection = {“name”};

Cursor cursor = database.query(“mytable”, projection, null, null, null, null, null);

if (cursor.moveToFirst()) {

do {

String name = cursor.getString(cursor.getColumnIndex(“name”));

//TODO: 处理name数据

} while (cursor.moveToNext());

}

“`

在以上代码中,我们使用了SQLiteDatabase.query方法来查询mytable表中的name列数据。从查询结果中,我们可以依次读取每个name数据。通过这种方式,我们可以从数据库中读取任意数量的数据。

结尾

以上就是Android应用中实现声音传输和数据库数据存储的方法。使用这些技术,您可以开发出更加实用的Android应用程序,为用户提供更好的使用体验。这些技术也可以作为开发者基础知识的一部分,为您今后的应用程序开发工作提供有用的参考。

相关问题拓展阅读:

Android 手机上的 USB MIDI 是做什么用的?怎么用

这个MIDI?和游敬唤慎可以参考一下这个磨轿

USB MIDI是一种协议,能够让支持这种乐器的设备跟手机相连接,因此想要开启这个功能,或者是midi键盘控制手机或者在手机上面使用,必须自己有对应的键盘,并且手机要支持这个功能。

使用方法:

1、把ogt数据线以及键盘手机准备好,把otg数据线一头跟手USB连接,一头跟键盘连接。

2、点击手机设置→我的设备。

3、点全部参数,不停点击版本直到出现开发者选项提示。

4、进入更多设置,再点击开发者选项。

5、点击USB配置,在菜单选择midi。笑基

6、在手机下载并安装一个叫mini keybord的软件,接着打开它,在根据自己的需要选择音源即可使用。

扩展资料:

MIDI产生背景:

MIDI发明者,是美国的加州音乐人,Dave Smith。

三十年前,音乐人没法同时操纵多个乐器,因为当时各种乐器是不可连接的。需要斗盯左右手同时弹奏两个键盘。

此后,合成器制造商Dave Smith,说服了唱片商采用了一种叫做“乐器数字接口”(Musical Instrument Digital Interface,MIDI)的通用格式,这种格式能够让合成器受到外部键盘信号控制,可以由唱片商的竞争对手制作,甚至直接从电脑输出。

使运算速度足够快的电脑处理音符采样,并能同时控制多个键盘和鼓机。

MIDI标准能让人们在自己家里进行音乐创作,使人们终于能够把合成器和鼓机连接到电脑上。于是,MIDI很快变成了连接各种型号的合成器、鼓机、采样数据和计算机的产业标准。

MIDI无论放置在哪里,都能在一个合成器上演奏些东西,并能在另外一个合成器上播放完全一样的声响。复杂而精心控制的的合成器声效、鼓机和采样样本见证了编曲技术从不可能到可能的转变。随着这种全新定义的制作方式,舞曲这种新的

音乐类型

诞生了。

之一台能够兼容MIDI格式的是一个由Dave Smith制作、叫做Prophet-900的合成器。它在1982年12月退役。 在当时的青少年游戏玩家中流行的Atari以及Commodore64型计算机也能通过一个5针的线缆控制另一端的MIDI乐器。

MIDI音乐格式,带有强烈的电子感,以及广泛适用性和便利性,催生了那个年代众多的音碰销谨乐类型。重塑了1980年代的流行乐。

MIDI格式早期的的“开源精神”概念,让每个人都能创作”复杂的音乐片段”,MIDI标准的支持者推动它成为连接着着全世界的自由纽带。三十年以后,MIDI仍然强劲不衰,作为专业音乐录制和制作的关键组件而存续着。

参考资料来源:

百度百科-MIDI

USB MIDI是安卓的一个协议,能够让支持的乐器设备与手机的USB设备相连接,该功能需要在手机的设置中打开键悉,方法为(演示以小米手机为例,其他手机操作方法大致相同):

1.首先在手机的桌面上点击【设置】图标,进入手机的设置页稿销乎面。

2.在设置页面中,点击【我的设备】进入设备管理页面。

3.在【我的设备】页面,点击【全部参数】这个选项。

4.在参数页面点击【版本号】将手机的开发者模式开启。

5.返回设置页面即可看到选项中增加了【开发者选项】。

6.点击页面中的【选择USB配置】,此时可以将USB MIDI线连接手机。

7.在底部弹出的选项中,选择【MIDI】这个选项,就可以斗丛成功将手机通过USB MIDI线连接支持的乐器。

数字化乐器接口,可以通过OTG将键盘(这里的键盘是指作曲的键盘,类似电钢琴,但是他只是按键,没有音源)与手机连结,功能有两种,之一是用键盘在手机上弹奏作曲,第二是用手机作为MIDI设备在电脑上作曲弹奏。

用法:

1、把ogt数据线以及键盘手拿帆银机准备好,把otg数据线一头跟手USB连接,一头跟键盘连接。

2、点击手机设置→我的设备。

3、不停点击版本直到出现开发者选项提示。

4、点击USB配轿裤置,在菜单消宴选择midi。

5、在手机下载并安装图一的软件,接着打开它,在图三根据自己的需要选择音源即可使用。

拓展知识:

MIDI(Musical Instrument Digital Interface)乐器数字接口 ,是20 世纪80 年代初为解决电声乐器之间的通信问题而提出的。MIDI是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。

它用音符的数字控制信号来记录音乐。一首完整的MIDI音乐只有几十KB大,而能包含数十条音乐轨道。几乎所有的现代音乐都是用MIDI加上音色库来制作合成的。

MIDI 传输的不是声音信号, 而是音符、控制参数等指令, 它指示MIDI 设备要做什么,怎么做, 如演奏哪个音符、多大音量等。它们被统一表示成MIDI 消息(MIDI Message) 。传输时采用异步串行通信, 标准通信波特率为31.25×( 1±0.01) KBaud。

参考资料:

MIDI_百度百科

如何使Android录音实现内录功能

之前在做直播的时候需要使用到内录功能,比如经常看到游戏主播在直播玩游戏,游戏的声音不是通过MIC录制的,而是内录完成的。故在此记录一下。

相信大家都很熟悉Android如果录音的了:

int frequency = 44100;    孝知    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;int minBufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration,    audioEncoding);int audioSource = MediaRecorder.AudioSource.MIC;

AudioRecord audioRecord = new AudioRecord(audioSource, frequency,

channelConfiguration, audioEncoding, minBufferSize);

audioRecord.startRecording();

AudioSource输入源介绍

项目

介绍

权限

DEFAULT    默认。在源码 system/media/audio/include/system/audio.h配置默认项    无    

MIC    麦克风    无    

VOICE_UPLINK    录音上行线路    android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用    

VOICE_DOWNLINK    录音下行线路    android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用    

VOICE_CALL    录音上下线路    android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用    

CAMCORDER    摄像头的麦克风    无    

VOICE_RECOGNITION    

语音识别

   无    

VOICE_COMMUNICATION    

网络

   无    

REMOTE_SUBMIX    传输到远程的音频混合流。默认情况下如何用该项录音,本地巧滑消

扬声器

或者耳机的声音将会被截走    android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第让袜三方app使用    

好了,现在我们知道了REMOTE_SUBMIX可以实现内录功能了。有两点比较麻烦:

需要系统权限

会截走扬声器和耳机的声音,也就是说再录音时本地无法播放声音

系统权限问题

这个对我来说比较好办,因为我是直接在android设备板子上开发,可以直接使用系统签名编译。首先在AndroidManifest.xml添加

android:sharedUserId=”android.uid.system”

其次,

之一种方法:

adb shell 执行:

signapk.jar platform.x509.pem platform.pk8 app-unsigned.apk signed.apk

adb push signed.apk /system/app

第二种方法:

编写Android.mk : 设置签名为platform

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := YourApp

LOCAL_CERTIFICATE := platform

LOCAL_PROGUARD_FLAG_FILES := proguard.flagsinclude $(BUILD_PACKAGE)include $(call all-makefiles-under,$(LOCAL_PATH))

截走扬声器和耳机的声音问题

修改framework下av/services/audiopolicy/AudioPolicyManager.cpp

audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy,     bool fromCache)

getDeviceForStrategy方法下找到

if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8(“0”)) != 0) {device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;

}

修改为

if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8(“0”)) != 0) {device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE);device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);

}

意思是声音输出的设备添加了耳机和扬声器,这里可根据实际情况设置。

至此,将最开始的录音代码

int audioSource = MediaRecorder.AudioSource.MIC;

改成

int audioSource = MediaRecorder.AudioSource.REMOTE_SUBMIX;

就可以实现内录功能了。

ps:

在不修改源码的情况下,第三方app目前暂不知如何实现内录。

延伸阅读

5.0以后请求Android录屏默认会弹出确认框,但在系统app下请求就不会弹出了(具体可以去看源码)。这也是为了

谷歌

为了安全考虑。

不过5.0的时候这个弹框却是一个大漏洞,被国内360发现了,给你们链接^_^

Android 5.0屏幕录制漏洞

android 声音传输数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于android 声音传输数据库,Android应用中实现声音传输与数据库的数据存储,Android 手机上的 USB MIDI 是做什么用的?怎么用,如何使Android录音实现内录功能的信息别忘了在本站进行查找喔。


数据运维技术 » Android应用中实现声音传输与数据库的数据存储 (android 声音传输数据库)