Android之手机振动和振铃

作为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.官网状态图:

Android之手机振动和振铃_第1张图片

你可能感兴趣的:(Android学习,安卓振动,安卓振铃)