Android之手机振动和振铃
吴振华 · 440浏览 · 发布于2019-05-29
作为APP开发,用户交互中除了显示的效果展示,最强有力提醒用户操作莫过于振动和音效了。今天开始这方面的总结,准备比较规范且完善的记录这方面的内容。
一、振动的实现
1.使用振动所需的权限
<uses-permission android:name="android.permission.VIBRATE" />
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; VirateUtil.virate(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.官网状态图:
相关推荐
android下vulkan与opengles纹理互通
talkchan · 1179浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图
奔跑的男人 · 2175浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal
吴振华 · 869浏览 · 2019-05-09 17:15:04
在华为写了十几年代码,我为什么还没有被拿去“祭天”
追忆似水年华 · 1201浏览 · 2019-05-09 17:22:20
android 通过修改图片像素实现CircleImageView
吴振华 · 1127浏览 · 2019-05-09 22:26:56
分类专栏
最新发布
最热排行
0评论