前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发笔记(五十八)铃声与震动

Android开发笔记(五十八)铃声与震动

作者头像
aqi00
发布2019-01-18 11:08:59
1.6K0
发布2019-01-18 11:08:59
举报
文章被收录于专栏:老欧说安卓

拖动条SeekBar

SeekBar继承自进度条ProcessBar,有关ProcessBar的介绍见《Android开发笔记(四十九)异步任务处理AsyncTask》。SeekBar与ProcessBar的不同之处在于,SeekBar是可以拖动的,因此SeekBar可用于媒体播放的进度条,在拖动进度条后,播放器可快进或者快退到指定位置开始播放媒体;SeekBar也可用于调节铃声的音量大小、调节屏幕的亮度、调节字体的大小等等。 下面是SeekBar新增加的几个方法与事件: setThumb : 设置当前进度位置的图标 setThumbOffset : 设置当前进度图标的偏移量 setKeyProgressIncrement : 设置使用方向键更改进度时每次的增加值 拖动条的拖动事件 监听器类名 : OnSeekBarChangeListener 设置监听器的方法 : setOnSeekBarChangeListener 监听器需要重写的方法 :  onProgressChanged : 拖动过程中触发 onStartTrackingTouch : 开始拖动时触发 onStopTrackingTouch : 停止拖动时触发,一般在该方法中加入业务逻辑

铃声管理AudioManager

Android中有六类铃音,分别是:通话音、系统音、来电与收短信的铃声、媒体声(包括音频、视频、游戏等等)、闹钟声、通知声,管理这些铃声音量的工具是AudioManager类。 下面是六类铃声的类型说明: STREAM_VOICE_CALL : 通话音 STREAM_SYSTEM : 系统音 STREAM_RING : 来电与收短信的铃声 STREAM_MUSIC : 媒体声(包括音频、视频、游戏等等) STREAM_ALARM : 闹钟声 STREAM_NOTIFICATION : 通知声 下面是AudioManager的常用方法: getStreamMaxVolume : 获取指定类型铃声的最大音量。 getStreamVolume : 获取指定类型铃声的当前音量。 getRingerMode : 获取指定类型铃声的响铃模式。RINGER_MODE_NORMAL表示正常,RINGER_MODE_SILENT表示静音,RINGER_MODE_VIBRATE表示震动 setStreamVolume : 设置指定类型铃声的当前音量。 adjustStreamVolume : 调整指定类型铃声的当前音量。第一个参数是铃声类型;第二个参数是调整方向,ADJUST_RAISE表示调大一级,ADJUST_LOWER表示调小一级,ADJUST_SAME表示保持不变;第三个参数表示调整时的附加动作,一般使用FLAG_PLAY_SOUND表示调整时提示一个铃声。 setRingerMode : 设置指定类型铃声的响铃模式。

震动器Vibrator

Vibrator用于控制手机的振动操作,它的对象需要从系统服务VIBRATOR_SERVICE中获取。震动器的使用比较简单,主要方法如下所示: hasVibrator : 判断设备是否拥有震动器。 vibrate : 震动手机。该方法有多个重载函数,即可设定单次震动的时长,也可设置多次震动的时长,还可设置是否重复震动。 cancel : 取消震动。 震动需要在AndroidManifest.xml中加上如下权限:

代码语言:javascript
复制
    <!-- 震动 -->
    <uses-permission android:name="android.permission.VIBRATE" />

代码示例

下面是铃声管理即设置音量的代码例子:

代码语言:javascript
复制
import com.example.exmring.R;

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class RingActivity extends Activity implements OnSeekBarChangeListener, OnClickListener {

	private static final String TAG = "RingActivity";
	private SeekBar sb_voice, sb_system, sb_ring, sb_music, sb_alarm, sb_notify;
	private ImageView iv_voice_add, iv_system_add, iv_ring_add, iv_music_add, iv_alarm_add, iv_notify_add;
	private ImageView iv_voice_del, iv_system_del, iv_ring_del, iv_music_del, iv_alarm_del, iv_notify_del;
	private int[] mStreamType = {
			AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_SYSTEM,
			AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
			AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION};
	private int[] mMaxVolume = {0, 0, 0, 0, 0, 0};
	private int[] mNowVolume = {0, 0, 0, 0, 0, 0};
	private SeekBar[] mSeekBar = {
			sb_voice, sb_system, sb_ring,
			sb_music, sb_alarm, sb_notify};
	private int[] mStreamRes = {
			R.id.sb_voice, R.id.sb_system, R.id.sb_ring,
			R.id.sb_music, R.id.sb_alarm, R.id.sb_notify};
	private ImageView[] mAddView = {
			iv_voice_add, iv_system_add, iv_ring_add,
			iv_music_add, iv_alarm_add, iv_notify_add};
	private int[] mAddRes = {
			R.id.iv_voice_add, R.id.iv_system_add, R.id.iv_ring_add,
			R.id.iv_music_add, R.id.iv_alarm_add, R.id.iv_notify_add};
	private ImageView[] mDelView = {
			iv_voice_del, iv_system_del, iv_ring_del,
			iv_music_del, iv_alarm_del, iv_notify_del};
	private int[] mDelRes = {
			R.id.iv_voice_del, R.id.iv_system_del, R.id.iv_ring_del,
			R.id.iv_music_del, R.id.iv_alarm_del, R.id.iv_notify_del};
	
	private int SEEK_BAR=1, ADD_VIEW=2, DEL_VIEW=3;
	private AudioManager mAudioMgr;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ring);
		
		for (int i=0; i<mStreamType.length; i++) {
			mSeekBar[i] = (SeekBar) findViewById(mStreamRes[i]);
			mAddView[i] = (ImageView) findViewById(mAddRes[i]);
			mDelView[i] = (ImageView) findViewById(mDelRes[i]);
		}
		
		setStreamVolume();
		for (int i=0; i<mStreamType.length; i++) {
			mSeekBar[i].setOnSeekBarChangeListener(this);
			mAddView[i].setOnClickListener(this);
			mDelView[i].setOnClickListener(this);
		}
		
	}
	
	void setStreamVolume() {
		mAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
		for (int i=0; i<mStreamType.length; i++) {
			int type = mStreamType[i];
			mMaxVolume[i] = mAudioMgr.getStreamMaxVolume(type);
			mNowVolume[i] = mAudioMgr.getStreamVolume(type);
			mSeekBar[i].setProgress(100 * mNowVolume[i]/mMaxVolume[i]);
		}
	}

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
	}

	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		Log.d(TAG, "当前进度为:"+seekBar.getProgress()+", 最大进度为"+seekBar.getMax());
		int index = getArrayIndex(seekBar.getId(), SEEK_BAR);
		int type = mStreamType[index];
		int volume = mMaxVolume[index] * seekBar.getProgress()/seekBar.getMax();
		Log.d(TAG, "volume="+volume+", last volume="+mNowVolume[index]+", max volume="+mMaxVolume[index]);
		if (volume != mNowVolume[index]) {
			mNowVolume[index] = volume;
			seekBar.setProgress(100 * mNowVolume[index]/mMaxVolume[index]);
		}
		mAudioMgr.setStreamVolume(type, volume, AudioManager.FLAG_PLAY_SOUND);
	}

	@Override
	public void onClick(View v) {
		int add_index = getArrayIndex(v.getId(), ADD_VIEW);
		int del_index = getArrayIndex(v.getId(), DEL_VIEW);
		if (add_index != -1) {
			SeekBar seekBar = mSeekBar[add_index];
			if (mNowVolume[add_index] < mMaxVolume[add_index]) {
				mNowVolume[add_index] = mNowVolume[add_index]+1;
				seekBar.setProgress(100 * mNowVolume[add_index]/mMaxVolume[add_index]);
				mAudioMgr.adjustStreamVolume(mStreamType[add_index], AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);
			}
		} else if (del_index != -1) {
			SeekBar seekBar = mSeekBar[del_index];
			if (mNowVolume[del_index] > 0) {
				mNowVolume[del_index] = mNowVolume[del_index]-1;
				seekBar.setProgress(100 * mNowVolume[del_index]/mMaxVolume[del_index]);
				mAudioMgr.adjustStreamVolume(mStreamType[del_index], AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);
			}
		}
	}

	private int getArrayIndex(int resid, int type) {
		int index = -1;
		if (type == SEEK_BAR) {
			for (int i=0; i<mSeekBar.length; i++) {
				if (mSeekBar[i].getId() == resid) {
					index = i;
					break;
				}
			}
		} else if (type == ADD_VIEW) {
			for (int i=0; i<mAddView.length; i++) {
				if (mAddView[i].getId() == resid) {
					index = i;
					break;
				}
			}
		} else if (type == DEL_VIEW) {
			for (int i=0; i<mDelView.length; i++) {
				if (mDelView[i].getId() == resid) {
					index = i;
					break;
				}
			}
		}
		return index;
	}

}

下面是设备震动的代码例子:

代码语言:javascript
复制
import com.example.exmring.R;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Toast;

public class ShakeActivity extends Activity implements OnCheckedChangeListener, OnClickListener {

	private static final String TAG = "ShakeActivity";
	private EditText et_duration;
	private CheckBox ck_repeat;
	private Button btn_begin, btn_end;
	private Vibrator mVibrator;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_shake);
		
		et_duration = (EditText) findViewById(R.id.et_duration);
		ck_repeat = (CheckBox) findViewById(R.id.ck_repeat);
		btn_begin = (Button) findViewById(R.id.btn_begin);
		btn_end = (Button) findViewById(R.id.btn_end);
		
		ck_repeat.setOnCheckedChangeListener(this);
		btn_begin.setOnClickListener(this);
		btn_end.setOnClickListener(this);
		
		mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.btn_begin) {
			if (mVibrator.hasVibrator() != true) {
				Toast.makeText(this, "当前设备未找到震动器", Toast.LENGTH_LONG).show();
			} else {
				long duration = Integer.parseInt(et_duration.getText().toString());
				if (ck_repeat.isChecked() != true) {
					mVibrator.vibrate(duration);
				} else {
					long[] pattern = {duration, duration};
					mVibrator.vibrate(pattern, 0);
				}
			}
		} else if (v.getId() == R.id.btn_end) {
			mVibrator.cancel();
		}
	}

	@Override
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
	}
	
}

点击下载本文用到的铃声与震动操作的工程代码 点此查看Android开发笔记的完整目录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年02月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 拖动条SeekBar
  • 铃声管理AudioManager
  • 震动器Vibrator
  • 代码示例
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档