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'
}

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

(0)

相关推荐

  • 微信抢红包ASP.NET代码轻松实现

    群里都在玩抢红包,抢了再发,发了再抢,简直是无聊,程序员感兴趣是的如何实现,这里简单说说实现思路,附上dome,代码有点low,好在是实现了,具体内容如下 正文 100块发30个红包 50块发13个红包 1块发10个红包 发红包需要满足以下几个条件 1.总金额不变 2.每个红包都必须有钱 3.尽量的均匀点,不然抢红包没什么意思了 实现思路 1.首先要确定最小单位,这里是精确到分,我这里以int类型进行计算,得出的结果也全是int类型 2.数据均匀,这里以  1<n<(剩余金额/剩余红包数)*2

  • PHP版微信公众平台红包API

    重写了一下PHP下面的微信API接口, 微信红包支持,JSAPI的动态参数接口支持 http://git.oschina.net/youkuiyuan/yky_test/blob/master/class/wxapi.class.php 微信API类 - 增加红包支持 <?php /******************************************************** * @author Kyler You <QQ:2444756311> * @link htt

  • Android抢红包插件实现原理浅析

    抢红包,先看效果图~ 实现自动抢红包,解决问题有两点: 一:如何实时监听发红包的事件 二:如何在红包到来的时候自动进入页面并自动点击红包 一.如何获取红包到来的事件 为了获取红包到来状态栏的变化,我们要用到一个类:Accessibility 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互. 这包括了有些用户由于视力上,身体上,年龄上的问题致使他们不能看完整的屏幕或者使用触屏,也包括了无法很好接收到语音信息和提示的听力能力比较弱的用户. Android提供了Accessibi

  • Android辅助功能AccessibilityService与抢红包辅助

    推荐阅读:Android中微信抢红包插件原理解析及开发思路 抢红包的原理都差不多,一般是用Android的辅助功能(AccessibilityService类)先监听通知栏事件或窗口变化事件来查找红包关键字然后去模拟点击或打开红包. 下面附上源码,程序已实现自动抢红包,锁屏黑屏状态自动解锁亮屏,Android4.X测试通过.函数具体功能请看详细注释. 注:在聊天界面收到红包不会自动打开,因为通知栏没有消息提示从而监听不了,此时只需手动点一下即可.其他未知情况请自行用LogCat调试,源码已经有相

  • 大家在抢红包,程序员在研究红包算法

    除夕全天微信用户红包总发送量达到10.1亿次,摇一摇互动量达到110亿次,红包峰值发送量为8.1亿次/分钟. 抛开微信红包的市场价值不谈,红包本身的算法也引发了热议,由于官方没有给出明确的说法,各家也是众说纷纭,小编下面也为大家带来几种分析. 首先看看数据分析帝 大多数人都做出自己的猜测,这也是在不知道内部随机算法的时候的唯一选择,但是大多数人没有给出自己亲自的调查结果.这里给出一份100样本的调查抽样样本数据,并提出自己的猜测. 1. 钱包钱数满足截尾正态随机数分布.大致为在截尾正态分布中取随

  • Android实现QQ抢红包插件

    又想到快要过年了,到时候还不知道群里要发好多红包,所以我将之前在网上宕的一份微信抢红包的代码修改了一下,实现了QQ抢红包!可以支持抢QQ拼手气红包,普通红包,口令红包,现在再也不怕20年单身手速的人跟我抢红包了! 先看测试效果图: 1.抢QQ口令红包  可以看见,只要红包一发出,自动填写口令并发出,帮你将红包抢到手! 2.抢QQ拼手气红包 拼手气红包也是一样,只要红包一发出,自动帮你把红包抢到手,是不是很爽的感觉? 3.抢QQ好友发送的红包 只要好友或者群里的人把红包一发出,就会第一时间让你抢到

  • Android中微信抢红包插件原理解析及开发思路

    一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们

  • WinForm天猫双11自动抢红包源码分享

    本文实例为大家分享了抢红包源码,供大家参考,具体内容如下 1. 正确获取红包流程 2. 软件介绍 2.1 效果图: 2.2 功能介绍 2.2.1 账号登录 页面开始时,会载入这个网站:https://login.taobao.com/member/login.jhtml?redirect_url=http%3A%2F%2F1111.tmall.com%2F 登录成功后,会自动跳转到1111.tmall.com活动页面. 2.2.2 [去抽奖]按钮 这按钮是手动跳转到1111.tmall.com页

  • 教你一步步实现Android微信自动抢红包

    本文介绍微信自动抢红包的实现方法,主要实现以下几个功能: 1.自动拆开屏幕上出现的红包 2.处于桌面或聊天列表时接收到红包信息时自动进入聊天界面并拆红包 3.日志功能,记录抢红包的详细日志 实现原理 1.利用AccessibilityService辅助服务,监测屏幕内容,实现自动拆红包的目的. 2.利用ActiveAndroid数据库简单记录红包日志 3.利用preference实现监控选项纪录 最终界面 抢红包核心代码 AccessibilityService配置 android:access

  • Android实现微信自动抢红包的程序

    简单实现了微信自动抢红包的服务,原理就是根据关键字找到相应的View, 然后自动点击.主要是用到AccessibilityService这个辅助服务,基本可以满足自动抢红包的功能,但是有些逻辑需要优化,比如,拆完一个红包后,必须手动点击返回键,才能进行下一次自动抢红包. AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="h

随机推荐