Android抢红包助手开发全攻略
程序员文章站
2024-03-05 14:04:54
背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。
需求:收到红包的时候进行提醒,然后跳转到红包的界面方...
背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。
需求:收到红包的时候进行提醒,然后跳转到红包的界面方便用户。
思路:获取“读取通知信息”权限,然后开启服务监控系统通知,判断如果是微信红包就进行提醒(声音),然后跳转到红包所在的地方。
界面:
界面分为两部分,一部分是可以对app进行操作的,下面是一个可以滑动的界面,提示用户如何是软件正常工作,布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <linearlayout android:id="@+id/root" 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" android:layout_marginleft="10dp" android:layout_marginright="10dp" android:layout_margintop="5dp" android:orientation="vertical" tools:context="com.fndroid.administrator.justforyou.mainactivity"> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="3" android:text="打开提示音"/> <checkbox android:id="@+id/ismusic" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </linearlayout> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="音量调节"/> <seekbar android:id="@+id/seekbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1"/> </linearlayout> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <textview android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:text="有红包亮屏并解锁"/> <checkbox android:id="@+id/isunlock" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </linearlayout> <button android:id="@+id/setpermision" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="设置通知权限"/> <scrollview android:layout_width="match_parent" android:layout_height="match_parent"> <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp" android:text="声明:"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="本软件为个人开发所得,只能对微信红包进行提醒。请合理使用本软件,使用不当造成的各种行为均与本人无关。软件使用过程不联网,不存在任何盗窃用户信息行为,请放心使用。"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp" android:text="使用方法:"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="①如果未赋予软件读取通知权限,点击按钮“设置通知权限"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="②在本软件右侧勾选上,并确认提示信息"/> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaletype="fitcenter" android:src="@drawable/inf"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="③关闭微信群的消息免打扰(取消图中的绿色按钮)"/> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/inf2"/> </linearlayout> </scrollview> </linearlayout>
app打开的时候开启一个服务,编写一个notificationlistenerservice的子类并实现onnotificationposted和onnotificationremoved方法,前面的方法会在收到通知的时候调用
// 编写一个notificationlistenerservice的子类并实现onnotificationposted和onnotificationremoved方法 // 这两个方法在从sdk版本21的时候开始变成了非抽象,不重写则不能兼容21以下设备 public class notificationservice extends notificationlistenerservice { private keyguardmanager.keyguardlock kl; @override public void onnotificationposted(statusbarnotification sbn) { // 主界面设置的信息保存在sharedpreferences中,在这里进行获取 sharedpreferences sharedpreferences = getsharedpreferences("userdata", mode_private); // 判断消息是否为微信红包 if (sbn.getnotification().tickertext.tostring().contains("[微信红包]") && sbn.getpackagename ().equals("com.tencent.mm")) { // 读取设置信息,判断是否该点亮屏幕并解开锁屏,解锁的原理是把锁屏关闭掉 if (sharedpreferences.getboolean("isunlock",true)) { keyguardmanager km = (keyguardmanager) getsystemservice(getapplicationcontext() .keyguard_service); kl = km.newkeyguardlock("unlock"); // 把系统锁屏暂时关闭 kl.disablekeyguard(); powermanager pm = (powermanager) getsystemservice(getapplicationcontext() .power_service); powermanager.wakelock wl = pm.newwakelock(powermanager.acquire_causes_wakeup | powermanager.screen_dim_wake_lock, "bright"); wl.acquire(); wl.release(); } try { // 打开notification所对应的pendingintent sbn.getnotification().contentintent.send(); } catch (pendingintent.canceledexception e) { e.printstacktrace(); } // 判断是否该播放提示音 if (sharedpreferences.getboolean("ismusic",true)){ mediaplayer mediaplayer = new mediaplayer().create(this, r.raw.heihei); mediaplayer.start(); } // 这里监听一下系统广播,判断如果屏幕熄灭就把系统锁屏还原 intentfilter intentfilter = new intentfilter(); intentfilter.addaction("android.intent.action.screen_off"); screenoffreceiver screenoffreceiver = new screenoffreceiver(); registerreceiver(screenoffreceiver, intentfilter); } } class screenoffreceiver extends broadcastreceiver { @override public void onreceive(context context, intent intent) { if (kl != null) { // 还原锁屏 kl.reenablekeyguard(); } } } @override public void onnotificationremoved(statusbarnotification sbn) { super.onnotificationremoved(sbn); } }
主的activity,注释在代码中了,就不详细说了
public class mainactivity extends appcompatactivity implements compoundbutton .oncheckedchangelistener, view.onclicklistener,seekbar.onseekbarchangelistener { private linearlayout root; private checkbox ismusic; private checkbox isunlock; private sharedpreferences.editor editor; private sharedpreferences sharedpreferences; private button setpermision; private seekbar seekbar; private audiomanager audiomanager; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // 获取控件实例 root = (linearlayout) findviewbyid(r.id.root); ismusic = (checkbox) findviewbyid(r.id.ismusic); isunlock = (checkbox) findviewbyid(r.id.isunlock); setpermision = (button) findviewbyid(r.id.setpermision); seekbar = (seekbar) findviewbyid(r.id.seekbar); // 注册监听 ismusic.setoncheckedchangelistener(this); isunlock.setoncheckedchangelistener(this); setpermision.setonclicklistener(this); seekbar.setonseekbarchangelistener(this); // 读取设置信息 sharedpreferences = getsharedpreferences("userdata", mode_private); editor = sharedpreferences.edit(); boolean music = sharedpreferences.getboolean("ismusic", true); boolean unlock = sharedpreferences.getboolean("isunlock", true); ismusic.setchecked(music); isunlock.setchecked(unlock); // 获得audiomanager,控制系统音量 audiomanager = (audiomanager) getsystemservice(this.audio_service); seekbar.setmax(audiomanager.getstreammaxvolume(audiomanager.stream_music)); seekbar.setprogress(audiomanager.getstreamvolume(audiomanager.stream_music)); // 监听系统媒体音量改变,并改变界面上的seekbar的进度 intentfilter intentfilter = new intentfilter(); intentfilter.addaction("android.media.volume_changed_action"); volumreceiver receiver = new volumreceiver(); registerreceiver(receiver,intentfilter); // 开启服务 intent intent = new intent(mainactivity.this, notificationservice.class); startservice(intent); } @override public boolean onkeydown(int keycode, keyevent event) { // 判断返回键点击,提示用户是否确认退出 if (keycode == keyevent.keycode_back && event.getrepeatcount() == 0) { snackbar snackbar = snackbar.make(root, "退出软件", snackbar.length_long) .setaction("确认", new view.onclicklistener() { @override public void onclick(view v) { mainactivity.this.finish(); } }); snackbar.show(); return true; } return super.onkeydown(keycode, event); } @override public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) { // checkbox的点击监听 switch (buttonview.getid()) { case r.id.ismusic: editor.putboolean("ismusic", ischecked); editor.commit(); break; case r.id.isunlock: editor.putboolean("isunlock", ischecked); editor.commit(); break; } } @override public void onclick(view v) { switch (v.getid()){ case r.id.setpermision: // 打开系统里面的服务,方便用户直接赋予权限 intent intent = new intent(settings.action_notification_listener_settings); startactivity(intent); break; } } @override public void onprogresschanged(seekbar seekbar, int progress, boolean fromuser) { } @override public void onstarttrackingtouch(seekbar seekbar) { } @override public void onstoptrackingtouch(seekbar seekbar) { // seekbar的监听,滑动停止就修改系统媒体音量 audiomanager.setstreamvolume(audiomanager.stream_music,seekbar.getprogress(),0); } // 音量广播接收 class volumreceiver extends broadcastreceiver{ @override public void onreceive(context context, intent intent) { seekbar.setprogress(audiomanager.getstreamvolume(audiomanager.stream_music)); } } }
mainfest
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.fndroid.administrator.justforyou" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.bind_notification_listener_service"/> <uses-permission android:name="android.permission.wake_lock" /> <uses-permission android:name="android.permission.disable_keyguard" /> <application android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main"/> <category android:name="android.intent.category.launcher"/> </intent-filter> </activity> <service android:name=".notificationservice" android:permission="android.permission.bind_notification_listener_service"> <intent-filter> <action android:name="android.service.notification.notificationlistenerservice" /> </intent-filter> </service> </application> </manifest>
gradle添加依赖,因为用了snackbar
dependencies { compile filetree(dir: 'libs', include: ['*.jar']) testcompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。