欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android抢红包助手开发全攻略

程序员文章站 2024-03-05 14:04:54
背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。 需求:收到红包的时候进行提醒,然后跳转到红包的界面方...

背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。
需求:收到红包的时候进行提醒,然后跳转到红包的界面方便用户。
思路:获取“读取通知信息”权限,然后开启服务监控系统通知,判断如果是微信红包就进行提醒(声音),然后跳转到红包所在的地方。 
界面:

Android抢红包助手开发全攻略

界面分为两部分,一部分是可以对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'
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。