好友
阅读权限10
听众
最后登录1970-1-1
|
作为独立开发者申请不到微信支付宝支付怎么办?网上找了下解决方案,最终发现监听通知栏消息来发起支付回调最简单。
下面我就简单说一下实现过程,第一次发帖,有不足的地方勿怪{:1_893:} 。
1.使用AndroidStudio创建一个Android工程
2.创建两个Service,一个是通知栏监听服务继承于NotificationListenerService,一个是GuardService守护服务。
创建守护服务原因是当Android内存紧张时会根据进程优先级来杀掉一些服务,守护服务和监听服务相互绑定,如果其中一个服务停止了就重新启动,这样来提高了服务的生存率。
public int onStartCommand(Intent intent, int flags, int startId) {
notifyManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Util.startForeground(this,1,"MyNotifyService","MyNotifyService.Name","监听服务","正在监听通知栏");
bindService(new Intent(this,GuardService.class),mServiceConnection, Context.BIND_IMPORTANT);
//打开通知测试
StartTestNotify();
return START_STICKY;
}
private ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
//连接断开,重新绑定
Intent intent=new Intent(MyNotifyService.this,GuardService.class);
intent.setAction("android.intent.action.RESPOND_VIA_MESSAGE");
ComponentName comName=Util.startServer(MyNotifyService.this,MyNotifyService.class);
}
};
把服务设置为前台运行,提高进程优先级
static void startForeground(Service service, int id, String CHANNEL_ONE_ID, String CHANNEL_ONE_NAME, String title, String content){
Notification.Builder builder=new Notification.Builder(service)
.setContentTitle(title)
.setContentText(content)
.setTicker(content);
//修改安卓8.1以上系统报错
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel notificationChannel=new NotificationChannel(CHANNEL_ONE_ID,CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_MIN);
notificationChannel.enableLights(false);//如果使用中的设备支持通知灯,则说明此通知通道是否应显示灯
notificationChannel.setShowBadge(false);//是否显示角标
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
NotificationManager manager=(NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(notificationChannel);
builder.setChannelId(CHANNEL_ONE_ID);
}
Notification notification=builder.build();
service.startForeground(id,notification);
}
3.在onNotificationPosted里面监听通知栏消息
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
Notification notification=sbn.getNotification();
try {
//有些通知不能解析出TEXT内容,这里做个信息能判断
if (notification.tickerText != null) {
String nMessage = notification.tickerText.toString();
ReceiveMessage(nMessage,sbn);
}
} catch (Exception e) {
Debug.LogError(e.toString());
}
}
private void ReceiveMessage(String msg,StatusBarNotification sbn){
//移除当前这个通知
notifyManager.cancel(sbn.getTag(),sbn.getId());
//是否读取到测试通知消息
if(msg.equals(MyNotify.CONTENT)){
if(state== LisNotifyState.unOpen){
state= LisNotifyState.running;
//开启服务
Message mm=new Message();
mm.obj= (Action) ()->GED.get().Notify("lisServiceStart",true);
toMainThread.sendMessage(mm);
}
state= LisNotifyState.running;
isReadNotify=true;
return;
}
GED.get().Notify("lisServiceMsg",msg);
}
到这一步基础功能就完成了,代码也很简单。
4.为了判断监听服务是否正常运行每个几秒就自己发一条通知
//打开通知测试
private void StartTestNotify(){
if(myNotify!=null)
return;
myNotify=new MyNotify();
Context context=this;
exitThread=false;
new Thread(()->{
try {
while (!exitThread){
isReadNotify=false;
myNotify.SendNotify(context);
if (state== LisNotifyState.running){
Thread.sleep(3000);
if(!isReadNotify){
//服务运行后没有读取到测试通知消息
//关闭测试通知线程
exitThread=false;
state= LisNotifyState.stop;
myNotify=null;
GED.get().Notify("lisServiceState",state);
break;
}else {
//服务正常运行
Message msg=new Message();
msg.obj= LisNotifyState.running;
}
} else {
Thread.sleep(1000);
}
GED.get().Notify("lisServiceState",state);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
MyNotify
public void SendNotify(Context context){
Notification.Builder builder=new Notification.Builder(context)
.setContentTitle("Test")
.setContentText("Content")
.setSmallIcon(R.mipmap.ic_launcher)
.setTicker("TestNotify");
NotificationManager manager=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if(manager==null){
Debug.LogError("NotificationManager 获取错误!");
return;
}
//修改安卓8.1以上系统报错
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel notificationChannel=new NotificationChannel(CHANNEL_ONE_ID,CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_MIN);
notificationChannel.enableLights(false);//如果使用中的设备支持通知灯,则说明此通知通道是否应显示灯
notificationChannel.setShowBadge(false);//是否显示角标
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
manager.createNotificationChannel(notificationChannel);
builder.setChannelId(CHANNEL_ONE_ID);
}
Notification notification=builder.build();
manager.notify(2,notification);
}
最后还需要做的功能:
1.每过几秒通知后台服务是否正常运行
2.获取到的支付通知交由后台处理
3.支付宝或者位置生成收款二维码个后台
4.后台调用正常运行服务端手机端支付二维码给用户支付
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|