控制音量大小widget
由于手机音量按键非常悲剧的掉了。无法控制手机音量大小。使用起来非常不方便。所以决定写一个小widget放在桌面能够随时控制音量吧。也算是解决一点便利问题。
1.一个简单的widget
由于我的需求非常easy不须要写一个程序再提供一个widget。所以直接一个AppWidgetProvider就好也就不须要AppWidgetHost 。
先在AndroidManifest里面增加一个receiver
<receiver android:name="WidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action android:name="android.appwidget.action.ACTION_APPWIDGET_ENABLED" />
</intent-filter>
<intent-filter>
<action android:name="android.appwidget.action.ACTION_APPWIDGET_DELETED" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_provider"/>
</receiver>
WidgetProvider是继承AppWidgetProvider的一个类,用来widget的详细响应实现。
里面的<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider"/>说明此receiver是widget,widget提供者的详细定义在xml文件widget_provider中。里面定义了widget的宽高,更新时间以及布局文件等。
widget_provider文件
<?
xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="70dp"
android:minHeight="140dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/widget">
</appwidget-provider>
以及layout文件widget。简单的两个按钮,音量加减。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:textSize="14pt"
android:text="+" />
<Button
android:id="@+id/button_reduce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button_add"
android:layout_below="@+id/button_add"
android:textSize="14pt"
android:text="-" />
</RelativeLayout>
接下来就是WidgetProvider类了,它继承了AppWidgetProvider。
其实一个AppWidgetProvider是一个BroadcastReceiver,仅仅是要实现几个函数:
2 public void onDeleted(Context context, int[] appWidgetIds)
3 public void onEnabled(Context context)
4 public void onDisabled(Context context)
---> onDisabled。当你把widget放入桌面时,会运行onEnabled ----> onUpdate。然后到了定义的updatePeriodMillis时间时会运行一次Update,onUpdate方法会被调用,假设你从桌面删除widget则运行onDeleted
---> onDisabled方法。
在widget中对两个音量按钮设置监听器
public void onUpdate(Context context, int[] appIds) {
System.out.println("update");
RemoteViews rv = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.activity_main);
PendingIntent add = PendingIntent.getBroadcast(context, 0,
new Intent("CLICK_ACTION_ADD") , 0);
rv.setOnClickPendingIntent(R.id.button_add, add);
PendingIntent reduce = PendingIntent.getBroadcast(context, 0, new Intent("CLICK_ACTION_REDUCE"), 0);
rv.setOnClickPendingIntent(R.id.button_reduce, reduce);
AppWidgetManager appWidgetManger = AppWidgetManager
.getInstance(context);
appWidgetManger.updateAppWidget(appIds, rv);
}
这样按钮在点击的时候会发送CLICK_ACTION_ADD或者CLICK_ACTION_REDUCE广播,因此须要在AndroidManifest里面的receiver再增加两个intent-filter
<span style="white-space:pre"> </span> <intent-filter>
<action android:name="CLICK_ACTION_ADD"/>
</intent-filter>
<intent-filter>
<action android:name="CLICK_ACTION_REDUCE"/>
</intent-filter>
声音的控制用AudioManager来实现,其adjustVolume方法能够控制最相关音量依照一个方向改变,增大或减小
AudioManager AM;
AM = (AudioManager)context.getSystemService("audio");
AM.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI|AudioManager.FLAG_PLAY_SOUND);
后面的flag參数能够控制是否显示音量UI。以及更改时是否播放声音。
完整的WidgetProvider类
package com.frank.widgettest;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.widget.RemoteViews;
public class WidgetProvider extends AppWidgetProvider{
AudioManager AM;
@Override
public void onEnabled(Context context) {
System.out.println("onEnabled");
super.onEnabled(context);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
System.out.println("update");
RemoteViews rv = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.widget);
PendingIntent add = PendingIntent.getBroadcast(context, 0,
new Intent("CLICK_ACTION_ADD") , 0);
rv.setOnClickPendingIntent(R.id.button_add, add);
PendingIntent reduce = PendingIntent.getBroadcast(context, 0, new Intent("CLICK_ACTION_REDUCE"), 0);
rv.setOnClickPendingIntent(R.id.button_reduce, reduce);
AppWidgetManager appWidgetManger = AppWidgetManager
.getInstance(context);
appWidgetManger.updateAppWidget(appWidgetIds, rv);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equals("CLICK_ACTION_ADD")) {
if(AM == null)
AM = (AudioManager)context.getSystemService("audio");
AM.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI|AudioManager.FLAG_PLAY_SOUND);
}
if(intent.getAction().equals("CLICK_ACTION_REDUCE")){
if(AM == null)
AM = (AudioManager)context.getSystemService("audio");
AM.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI|AudioManager.FLAG_PLAY_SOUND);
}
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
System.out.println("deleted");
super.onDeleted(context, appWidgetIds);
}
}
2.BroadcastReceiver能够取代AppWidgetProvider
其实第一次尝试的时候不知什么原因不能监听收到widget的onEnabled,onUpdate全部事件。一筹莫展时,看到Android API Guides里这样一段话
既然如此,我干脆直接使用一个BroadcastReceiver来取代AppWidgetProvider试试看吧。
结果没问题,各响应都能够收到音量控制正常。
public class WidgetProvider extends BroadcastReceiver{
AudioManager AM;
public void onEnabled() {
System.out.println("onEnabled");
}
public void onUpdate(Context context, int[] appIds) {
System.out.println("update");
RemoteViews rv = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.activity_main);
PendingIntent add = PendingIntent.getBroadcast(context, 0,
new Intent("CLICK_ACTION_ADD") , 0);
rv.setOnClickPendingIntent(R.id.button_add, add);
PendingIntent reduce = PendingIntent.getBroadcast(context, 0, new Intent("CLICK_ACTION_REDUCE"), 0);
rv.setOnClickPendingIntent(R.id.button_reduce, reduce);
AppWidgetManager appWidgetManger = AppWidgetManager
.getInstance(context);
appWidgetManger.updateAppWidget(appIds, rv);
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("CLICK_ACTION_ADD")) {
if(AM == null)
AM = (AudioManager)context.getSystemService("audio");
AM.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI|AudioManager.FLAG_PLAY_SOUND);
}
if(intent.getAction().equals("CLICK_ACTION_REDUCE")){
if(AM == null)
AM = (AudioManager)context.getSystemService("audio");
AM.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI|AudioManager.FLAG_PLAY_SOUND);
}
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_ENABLED)){
onEnabled();
}
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)){
int[] appWidgetIds = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
onUpdate(context, appWidgetIds);
}
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DELETED)){
onDeleted();
}
}
public void onDeleted() {
System.out.println("deleted");
}
由于逻辑方便定义的方法名也为AppWidgetProvider的方法名,也就是说用BroadcastReceiver能够做一个widget。
后来我又新建一个项目使用AppWidgetProvider(第一个方案)也成功运行。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRnJhbmtzdW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
转载请注明出处http://blog.csdn.net/franksun1991/article/details/26454043
控制音量大小widget的更多相关文章
- JS控制Video播放器(快进、后退、播放、暂停、音量大小)
思路: 一.首先监听触发事件. 比如:向上键对应的keyCode为38,向下键对应的keyCode为40,向左键对应的keyCode为37,向右键对应的keyCode为39,空格键对应的keyCode ...
- linux下调整音量大小
不得不说,在linux下整音频和视频真是不容易.在windows中自带了关于音频和视频的工具,在linux下要两眼一抹黑地使用命令进行操作. 主要还是在linux下没找到合适的gui的调整工具. 几番 ...
- Android 获取 AudioRecord 麦克风音量大小并做选择性发送
extends:http://blog.csdn.net/alvinhuai/article/details/8955127,http://mikespook.com/2010/11/android- ...
- delphi 控制音量 静音的类
delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...
- js 控制图片大小核心讲解
控制图片大小的方法有很多,在本文将为大家详细介绍下使用js实现缩放图片,核心代码如下,感兴趣的朋友可以参考下 缩放图片脚本分享 <!DOCTYPE HTML PUBLIC "-//W3 ...
- Wpf修改控制的大小
Wpf修改控制的大小 随窗体的改变而改变 在WINFORM中设置控件的Anchor属性就行了 在WPF中没有Anchor属性 但可以在布局中设置 相关属性实现同样的效果 相关属性 Horizontal ...
- C++ 调节PCM音频音量大小
在用解码器解码音频数据得到PCM音频数据块之后,可以在将数据送给声卡播放之前调节其音量大小,具体的实现函数如下: void RaiseVolume(char* buf, UINT32 size, UI ...
- Pycharm用鼠标滚轮控制字体大小的
Pycharm用鼠标滚轮控制字体大小的 一.pycharm字体放大的设置 File —> setting —> Keymap —>在搜寻框中输入:increase —> I ...
- Android 麦克风录音带音量大小动态显示的圆形自定义View
1.所谓无图无真相,先上效果图.我们要实现的就是中间那个录音的按钮,周边会显示一圈音量大小的波形 2.VolumCircleBar继承自View,我们进行了自定义,代码如下 package com.r ...
随机推荐
- error C3861: “L”: 找不到标识符
提示错误的语句:::CLSIDFromProgID(L("Shell.Application"), &clsid); 解决办法: 出现上面的错误是因为语法错误了,去掉字符串 ...
- java lambda filter写法
datas.stream().filter(m->!m.getSerialId().equals(setting.getSerialId())).collect(Collectors.toLis ...
- 记一次Tomcat运行失败记录
记一次Tomcat运行失败记录 如图tomcat运行之后会出现这样的情况,在网上百度之后大部分都说的是web.xml或者其他配置文件的问题,但是根据网上修改了之后却还是老样子. 这里有比较好的网址可以 ...
- 【Java多线程系列二】Thread类的方法
Thread实现Runnable接口并实现了大量实用的方法. /* * 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会 */ public s ...
- Linux环境变量永久设置方法(zsh)
1.之前一直使用:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./home/46005/cuda-9.0/lib64/来设置cuda库路径变量 -----临时的,当 ...
- 服务器搭建node环境
最近由于工作原因开始学习服务器的搭建和环境配置.记录一下我在服务器搭建node环境的步骤.中间踩了很多坑. 首先,确定自己的服务器可以连接到外网,如果连接不上的话,会出现ETIMEOUT的报错,但这只 ...
- swiper在微信端滑动效果不友好(滑动不了)的解决方案
如需转载请注明出处.好用就点赞吧 前提:我做的事竖直方向的一份报告,上下翻页滑动. 猜测原因: 1.检查自己的slide里面内容的样式的的高度,就是两个页面的高度不一致,测试的时候wrapper会取连 ...
- vue项目使用js-xlsx进行excel表格的导入和导出方法的简单原型封装
前提:已经安装好 file-saver xlsx和 script-loader,如未安装,请查看 https://www.cnblogs.com/luyuefeng/p/8031597.html 新建 ...
- git常用操作笔记
这是我看了廖雪峰的git教程,写的笔记,仅作为一个学习的记录 一.大多数我们面临的是已经有一个进行中的项目了,我们只需克隆下来就可以了 1.安装git,安装完后,可输入git,回车,查看是否已安装 2 ...
- (Struts2学习系列一)MyEclipse创建第一个struts2项目
点击MyEclipse菜单栏File按钮,点击new-->Web Project 输入Project name之后点击Finish 项目创建完成. 然后右键项目,点击MyEclipse--> ...