博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手机摇一摇功能音量大小跟系统音量一致
阅读量:7121 次
发布时间:2019-06-28

本文共 5409 字,大约阅读时间需要 18 分钟。

布局文文件:main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:gravity="center"
              android:background="#ffffff">
    <TextView
            android:id="@+id/myTextView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="请摇晃手机"
            android:textSize="30dp"
            android:textColor="#000000"
            android:gravity="center"
            />
</LinearLayout>
java文件:ShakeListener.java

package com.example.myShake;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
/**
 * 一个检測手机摇晃的监听器
 */
public class ShakeListener implements SensorEventListener {
// 速度阈值,当摇晃速度达到这值后产生作用
private static final int SPEED_SHRESHOLD = 3000;
// 两次检測的时间间隔
private static final int UPTATE_INTERVAL_TIME = 70;
// 传感器管理器
private SensorManager sensorManager;
// 传感器
private Sensor sensor;
// 重力感应监听器
private OnShakeListener onShakeListener;
// 上下文
private Context mContext;
// 手机上一个位置时重力感应坐标
private float lastX;
private float lastY;
private float lastZ;
// 上次检測时间
private long lastUpdateTime;
// 构造器
public ShakeListener(Context c) {
// 获得监听对象
mContext = c;
start();
}
// 開始
public void start() {
// 获得传感器管理器
sensorManager = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
if (sensorManager != null) {
// 获得重力传感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
// 注冊
if (sensor != null) {
sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_GAME);
}
}
// 停止检測
public void stop() {
sensorManager.unregisterListener(this);
}
// 设置重力感应监听器
public void setOnShakeListener(OnShakeListener listener) {
onShakeListener = listener;
}
// 重力感应器感应获得变化数据
public void onSensorChanged(SensorEvent event) {
// 如今检測时间
long currentUpdateTime = System.currentTimeMillis();
// 两次检測的时间间隔
long timeInterval = currentUpdateTime - lastUpdateTime;
// 推断是否达到了检測时间间隔
if (timeInterval < UPTATE_INTERVAL_TIME)
return;
// 如今的时间变成last时间
lastUpdateTime = currentUpdateTime;
// 获得x,y,z坐标
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// 获得x,y,z的变化值
float deltaX = x - lastX;
float deltaY = y - lastY;
float deltaZ = z - lastZ;
// 将如今的坐标变成last坐标
lastX = x;
lastY = y;
lastZ = z;
double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
* deltaZ)
/ timeInterval * 10000;
Log.v("thelog", "===========log===================");
// 达到速度阀值。发出提示
if (speed >= SPEED_SHRESHOLD) {
onShakeListener.onShake();
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// 摇晃监听接口
public interface OnShakeListener {
public void onShake();
}
}

java文件:MyActivity.java

package com.example.myShake;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.widget.TextView;
public class MyActivity extends Activity {
    private AudioManager audioManager;//管理音频的类
    private SoundPool soundPool;//声明一个SoundPool
    private int music, music2;//。来设置suondID
    private ShakeListener mShakeListener=null;
    public static long GrouplastUpdateTime;
    private TextView MyTextView;
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MyTextView=(TextView)findViewById(R.id.myTextView);
        mShakeListener = new ShakeListener(this);
        setListeners();
        initState();
    }
    //加入摇一摇声音
    private void initState() {
        soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);//第一个參数为同一时候播放数据流的最大个数,第二数据流类型,第三为声音质量
        music = soundPool.load(this, R.raw.shake_sound_male, 1); //把你的声音素材放到res/raw里,第2个參数即为资源文件,第3个为音乐的优先级
        music2 = soundPool.load(this, R.raw.shake_sound, 1);
    }
    //加入摇一摇监听
    private void setListeners() {
        mShakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() {
            public void onShake() {
                System.out.println("<<<<<<"+"Group");
                long currentUpdateTime = System.currentTimeMillis();
                long timeInterval = currentUpdateTime - GrouplastUpdateTime;
                //设置每三秒可摇一次
                if (timeInterval < 3000)
                    return;
                GrouplastUpdateTime = currentUpdateTime;
//                手机震动效果
//                Vibrator vVi = (Vibrator) MyActivity.this
//                        .getSystemService(Service.VIBRATOR_SERVICE);

//此处报错。什么安全异常,小五也不知道为啥  。望高手指点

//                vVi.vibrate(400);
                //播放音频。能够对左右音量分别设置,能够设置优先级,循环次数以及速率
                //速率最高2,最低0.5,正常为1
                float volumeNum = (float)getVolume()/7;
                int streamID = soundPool.play(music, 1, 1, 0, 0, (float)1.4);
                soundPool.setVolume(streamID, volumeNum, volumeNum);
//                soundPool.play(music, 1, 1, 0, 0, 1);//播放声音
                Thread thread=new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                            float volumeNum = (float)getVolume()/7;
                            int streamID = soundPool.play(music2, 1, 1, 0, 0, (float)1.4);
                            soundPool.setVolume(streamID, volumeNum, volumeNum);//播放声音
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
                thread.start();
                MyTextView.setText("Hello World!!!");
            }
        });
    }
    //获得当前系统音量 0~7
    private int getVolume(){
        int volume = -1;
        audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        volume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
        Log.i("STREAM_RING", "" + volume);
        return volume;
    }
}

转载地址:http://erxel.baihongyu.com/

你可能感兴趣的文章
Java的集合框架(Java Collections Framework)
查看>>
解析和生成Excel报表方法汇总::.NET发现之旅(七)
查看>>
活动目录设计中需要遵循的七个原则
查看>>
【STM32 .Net MF开发板学习-04】TinyGUI位图显示
查看>>
NoSQL数据库简介
查看>>
Kevin Systrom和他的Instagram
查看>>
Android 实现真机远程调试并适应7寸屏大小
查看>>
Oracle优化:千万级大表逻辑判断的累赘
查看>>
研讨会记录|与Xamarin工作簿研讨会探索UrhoSharp 3D
查看>>
python join 和 split的常用使用方法
查看>>
Oracle数据库日常管理之数据备份,恢复及迁移 (第八讲 )
查看>>
一段Winrunner的样例脚本
查看>>
IPSec应用方案设计
查看>>
FOSCommentBundle功能包:创建您的评论类和线索类
查看>>
C++动态数组再总结
查看>>
如何通过sar快速定位制约系统性能的瓶颈
查看>>
Java 枚举用法详解
查看>>
走在网页游戏开发的路上(十一)
查看>>
oc58--Category注意事项
查看>>
Linux下安装OpenOffice
查看>>