Generate And Play A Tone In Android hacking

 1 /***********************************************************************************
 2  *            Generate And Play A Tone In Android hacking
 3  *   声明:
 4  *      1. 源代码url: http://stackoverflow.com/questions/2413426/playing-an-arbitrary-tone-with-android
 5  *      2. 主要功能是能够让Android手机发出一定频率的声音;
 6  *      3. 当然我们也可以用来做各种波形发生器,这只是一个简单的Demo源码程序;
 7  *
 8  *                              2015-4-27 周一 晴 深圳 平山村 曾剑锋
 9  **********************************************************************************/
10 public class PlaySound extends Activity {
11     // originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
12     // and modified by Steve Pomeroy <[email protected]>
13     /* 声音持续3秒 */
14     private final int duration = 3;       // seconds
15     /* 采用率是8000 */
16     private final int sampleRate = 8000;
17     /* 总共采样多少个点 */
18     private final int numSamples = duration * sampleRate;
19     /* 利用总共采样的点数来生成数据数组 */
20     private final double sample[] = new double[numSamples];
21     /* 声音频率 */
22     private final double freqOfTone = 440; // hz
23
24     /* 主要是因为采用的16位的数据 */
25     private final byte generatedSnd[] = new byte[2 * numSamples];
26
27     Handler handler = new Handler();
28
29     @Override
30     public void onCreate(Bundle savedInstanceState) {
31         super.onCreate(savedInstanceState);
32         setContentView(R.layout.main);
33     }
34
35     @Override
36     protected void onResume() {
37         super.onResume();
38
39         // Use a new tread as this can take a while
40         final Thread thread = new Thread(new Runnable() {
41             public void run() {
42                 genTone();
43                 handler.post(new Runnable() {
44
45                     public void run() {
46                         playSound();
47                     }
48                 });
49             }
50         });
51         thread.start();
52     }
53
54     /**
55      * 生成上面参数对应的声音数据,保存在数组中
56      */
57     void genTone(){
58         // fill out the array
59         for (int i = 0; i < numSamples; ++i) {
60             /**
61              * 算法解析:
62              *     1. sampleRate/freqOfTone:每个周期才多少个点;
63              *     2. i / (sampleRate/freqOfTone):当前第i个点在整个周期的
64              *         采样点的比重(不知怎么表达 :) );
65              *     3. 2 * Math.PI * i / (sampleRate/freqOfTone):当前第i个点对应的弧度制;
66              *     4. Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone)):-1到1的sin函数值;
67              */
68             sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone));
69         }
70
71         // convert to 16 bit pcm sound array
72         // assumes the sample buffer is normalised.
73         /**
74          * 将上面-1到1范围的sin函数值,转换成-32767到32767范围的值,
75          * 这个值是16位的值,放在对应的数组中
76          */
77         int idx = 0;
78         for (final double dVal : sample) {
79             // scale to maximum amplitude
80             final short val = (short) ((dVal * 32767));
81             // in 16 bit wav PCM, first byte is the low order byte
82             generatedSnd[idx++] = (byte) (val & 0x00ff);
83             generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
84
85         }
86     }
87
88     void playSound(){
89         final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
90                 sampleRate, AudioFormat.CHANNEL_OUT_MONO,
91                 AudioFormat.ENCODING_PCM_16BIT/*16位数据*/, generatedSnd.length,
92                 AudioTrack.MODE_STATIC);
93         //将所有数据写出,相当于是发出声音
94         audioTrack.write(generatedSnd, 0, generatedSnd.length);
95         audioTrack.play();
96     }
97 }
时间: 2024-12-28 21:00:59

Generate And Play A Tone In Android hacking的相关文章

我有DIY一Android遥控-所有开源

1.试用 记得宋宝华在「设备驱动开发具体解释」提出一个这种理论「软件和硬件互相渗透对方的领地」,这次证明还是确实是这样,使用上层APP软件加上简单的更为简单的硬件设计就能够完毕一个遥控器了. 有开发应用程序网友发E-mail问网上那种DIY的红外遥控器是怎样工作的.查了一下眼下有两种方式,一种是基于USB一种是基于耳机孔.就简单的回复了一信息. 说是将音频信号/USB信号转换为红外信号. 事后自己都认为有点敷衍,还好自己硬件了解一些.软件也会开发.就将他们结合一下. 试用次合,如今开发规律比較清

Android 热更新——非侵入AOP框架

Android 客户端应用上线以后,一旦出现Bug,一般的解决思路是发修复包升级应用,这种方式不仅耗时,更重要的是用户需要频繁的升级版本,体验不好,所以优化的思路是在不发版本的情况下热更新,以期提高用户体验. 近期GitHub新出一种非侵入运行期AOP框架Dexposed, 下面简单了解一下这个框架,GitHub地址. 简要说明: 该框架基于AOP思想,支持经典的AOP使用场景,可应用于日志记录,性能统计,安全控制,事务处理,异常处理等方面. 针对Android平台,Dexposed支持函数级别

ANDROID打包错误ERROR:EXECUTION FAILED FOR TASK &#180;:APP:LINTVITALRELEASE&#180;.

来自:http://dditblog.com/itshare_657.html 今天修改之前的项目之后.准备打包的时候.一起打包不了.一直提示有问题.错误是一些什么Strings.xml里面的一些信息.有点看不懂.我也有尝试着改一下string.xml里面报错的地方.但仍然还是打包不了.然后往下翻的时候看到最后的提示消息如下 Error:Execution failed for task ´:app:lintVitalRelease´. > Lint found fatal errors whi

android PreferenceScreen使用笔记

preference.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <Preference android:title="基本信息" android:layout="@layout/text_

Android平台免Root无侵入AOP框架Dexposed使用详解

@author ASCE1885的 Github 简书 微博 CSDN 阿里巴巴无线事业部最近开源的Android平台下的无侵入运行期AOP框架Dexposed,该框架基于AOP思想,支持经典的AOP使用场景,可应用于日志记录,性能统计,安全控制,事务处理,异常处理等方面. 针对Android平台,Dexposed支持函数级别的在线热更新,例如对已经发布在应用市场上的宿主APK,当我们从crash统计平台上发现某个函数调用有bug,导致经常性crash,这时,可以在本地开发一个补丁APK,并发布

我也DIY一个Android遥控器-全部开源

1.试用 记得宋宝华在「设备驱动开发详解」提出一个这样的理论「软件和硬件互相渗透对方的领地」,这次证明还是确实是这样,使用上层APP软件加上简单的更为简单的硬件设计就可以完成一个遥控器了. 有开发应用程序网友发E-mail问网上那种DIY的红外遥控器是如何工作的,查了一下目前有两种方式,一种是基于USB一种是基于耳机孔.就简单的回复了一信息.说是将音频信号/USB信号转换为红外信号.事后自己都觉得有点敷衍,还好自己硬件了解一些,软件也会开发.就将他们结合一下. 试用次合,现在开发规律比较清晰了,

Maven 命令 创建 android项目

1.用android tool 创建项目. android create project \--target <target_ID> \--name <your_project_name> \--path path/to/your/project \--activity <your_activity_name> \--package <your_package_namespace>target is the "build target"

Android Maven 工程

1 maven-android-sdk-deployer插件安装 https://github.com/mosabua/maven-android-sdk-deployer 通过git下载工程 在环境变量中指定ANDROID_HOME.Path ANDROID_HOME=F:\tools\adt-bundle-windows-x86_64-20130522\sdk Path中添加:%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools 在下载完And

android studio使用笔记 待续。。。

o.首先将adroid studio keymap改为eclipse 1.android studio中的自动导入auto import: Eclipse自动添加import语句, 使用Ctrl + Shift + o组合, 可以自动查找java的import语句进行添加; Android默认是Alt+Enter单个添加import语句, 可以修改IDE, 使其自动添加, 所使用的java库; 位置: Files ->Settings-> IDE Settings-> Editor -&