作为APP开发,用户交互中除了显示的效果展示,最强有力提醒用户操作莫过于振动和音效了。今天开始这方面的总结,准备比较规范且完善的记录这方面的内容。
1.使用振动所需的权限
2.相关API
//检查硬件是否有振动器
boolean hasVibrator ()
//控制手机制动milliseconds毫秒
void vibrate (long milliseconds)
//让手机以指定pattern模式震动。
void vibrate (long[] pattern, int repeat)
//关闭震动
void cancel ()
对于void vibrate (long[] pattern, int repeat)参数解释:
pattern:传递一个int数组,它们是以毫秒为单位打开或关闭振动器的持续时间。第一个值表示在打开振动器之前要等待的毫秒数。下一个值表示在关闭振动器之前保持振动器的毫秒数。随后的值在以毫秒为单位的持续时间之间交替,以关闭振动器或打开振动器。
repeat:要使模式重复,请将索引传递到要在其中开始重复的模式数组,否则为-1以禁用重复。传入0是开头一直重复下去,传入2是从下标为2的地方开始重复振动。
3.VibrateUtil工具类代码:
import android.app.Activity;
import android.app.Service;
import android.os.Vibrator;
/**
* Created by Zachary on 2018-04-16.
*/
public class VibrateUtil {
/**
* 震动milliseconds毫秒
*/
public static void vibrate(final Activity activity, long milliseconds) {
Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);
if(vib.hasVibrator()){ //判断手机硬件是否有振动器
vib.vibrate(milliseconds);
}
}
/**
* 以pattern[]方式震动
*
* EG:long pattern[] = {100, 2000, 1000, 1000,3000};
*/
public static void vibrate(final Activity activity, long[] pattern,int repeat){
Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);
if(vib.hasVibrator()){
vib.vibrate(pattern,repeat);
}
}
/**
* 取消震动
*/
public static void virateCancle(final Activity activity){
//关闭震动
Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);
vib.cancel();
}
}
4.注意: (防止多次关闭抛出异常)
开启振动:
// 开启震动
isVirating = true;
VibrateUtil.vibrate(XXXActivity.this, new long[]{100, 200, 100, 200}, 0)
关闭振动:
//关闭震动
if (isVirating) {
isVirating = false;
VirateUtil.virateCancle(XXXActivity.this);
}
1.权限问题:
Android设置振铃需要更改系统设置,所以在6.0以后提高了权限级别,需要使用 WRITE_SETTINGS 权限才能进行振铃设置。
记得针对6.0设备,进行动态获取权限。
2.相关API
//根据Uri设置音频,当然还有其他几个重载的方法来指定特定的音频。
void setDataSource (Context context , Uri uri)
//设置是否循环播放
void setLooping (boolean looping)
//让MediaPlayer真正去装载音频文件
void prepare ()
//开始或恢复播放
void start ()
//暂停播放,调用start()可以恢复播放
void pause ()
//停止播放
void stop ()
//是否正在播放
boolean isPlaying ()
//释放与此MediaPlayer关联的资源
void release ()
3.MediaUtil工具类代码:
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
/**
* Created by Zachary on 2019-04-16.
*/
public class MediaUtil {
private static MediaPlayer mMediaPlayer;
//开始播放
public static void playRing(final Activity activity){
try {
//用于获取手机默认铃声的Uri
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(activity, alert);
//告诉mediaPlayer播放的是铃声流
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);
mMediaPlayer.setLooping(true);
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
//停止播放
public static void stopRing(){
if (mMediaPlayer!=null){
if (mMediaPlayer.isPlaying()){
mMediaPlayer.stop();
mMediaPlayer.release();
}
}
}
}
4.官网状态图: