package com.weishitechsub.kdcxqwb.fragment.Adapter;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.weishitechsub.kdcxqwb.R;
import com.weishitechsub.kdcxqwb.bean.ListBean;
import com.weishitechsub.kdcxqwb.utils.OnMultiClickListener;
import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender;
import java.util.List;
public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> {
private static final String TAG = "MyCourierAdapter";
private List<ListBean> mTrackList;
private Context context;
public MyCourierAdapter(List<ListBean> list, Context context) {
super(R.layout.my_courier_adapter,list);
this.context = context;
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) {
baseViewHolder.setText(R.id.tv_number,dataBean.getNum());
baseViewHolder.setText(R.id.tv_address,dataBean.getContext());
String state = dataBean.getState();
if (state != null) {
if (state.equals("0")) {
baseViewHolder.setText(R.id.tv_state,"在途");
}else if ((state.equals("5"))){
baseViewHolder.setText(R.id.tv_state,"派件");
}else if ((state.equals("3"))){
baseViewHolder.setText(R.id.tv_state,"签收");
}else if ((state.equals("6"))){
baseViewHolder.setText(R.id.tv_state,"退回");
}else if ((state.equals("4"))){
baseViewHolder.setText(R.id.tv_state,"退签");
}else {
baseViewHolder.setText(R.id.tv_state,"转投");
}
}
if (dataBean.getType() != null) {
String trackName = getTrackName(dataBean.getType());
baseViewHolder.setText(R.id.tv_type,trackName);
ImageView logo = baseViewHolder.getView(R.id.iv_logo);
LinearLayout line = baseViewHolder.getView(R.id.line);
if (trackName.equals("邮政快递包裹")) {
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_yz_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("京东物流")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_jd_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("圆通快递")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_yt_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("中通快递")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_zt_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("顺丰速运")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_sf_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("韵达快递")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_yd_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("申通快递")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_st_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else if (trackName.equals("EMS")){
baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_ems_bg);
logo.setVisibility(View.VISIBLE);
line.setVisibility(View.GONE);
}else {
baseViewHolder.setText(R.id.tv_name,trackName);
logo.setVisibility(View.GONE);
line.setVisibility(View.VISIBLE);
}
}
baseViewHolder.getView(R.id.iv_remind).setOnClickListener(new OnMultiClickListener() {
@Override
public void onMultiClick(View v) {
ListBean item = dataBean;
String number = item.getNum();
String type = item.getType();
String companyName = getTrackName(type);
// 检查通知权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+
if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
new AlertDialog.Builder(context)
.setTitle("需要通知权限")
.setMessage("请允许本应用发送快递到达通知,以便及时提醒您取件。\n\n进入【设置】→【通知】中开启权限。")
.setPositiveButton("去开启", (dialog, which) -> {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
})
.setNegativeButton("取消", null)
.show();
return;
}
}
// 权限已授予,继续执行提醒逻辑
Log.d(TAG, "用户点击【提醒】按钮: 快递单号=" + number + ", 公司编码=" + type + ", 公司名称=" + companyName);
Toast.makeText(v.getContext(), "已设置提醒: " + number, Toast.LENGTH_SHORT).show();
PackageNotificationSender sender = new PackageNotificationSender(context);
sender.sendPickupReminder(number, companyName);
startDeliveryPolling(context, number, companyName);
}
});
}
public void setTrackList(List<ListBean> list){
mTrackList = list;
}
private String getTrackName(String type){
if (mTrackList != null) {
for (ListBean item : mTrackList){
if (item.getNum()!= null && type != null ) {
if(TextUtils.equals(item.getNum(),type)){
return item.getCom();
}
}
}
}
return "";
}
private void startDeliveryPolling(Context context, String number, String companyName) {
Log.d(TAG, "开始轮询快递状态: 单号=" + number + ", 公司=" + companyName);
Handler handler = new Handler(Looper.getMainLooper());
Runnable pollingTask = new Runnable() {
int count = 0;
boolean arrived = false;
@Override
public void run() {
if (arrived) {
Log.d(TAG, "快递已到达,停止轮询: " + number);
return;
}
if (count > 10) {
Log.w(TAG, "轮询超过最大次数,停止: " + number);
return;
}
count++;
Log.d(TAG, "第 " + count + " 次轮询检查快递状态: " + number);
// 模拟第3次轮询时到达
if (count == 3) {
arrived = true;
Log.i(TAG, "🎉 快递已到达!单号: " + number);
PackageNotificationSender sender = new PackageNotificationSender(context);
sender.sendPickupReminder(number, companyName);
Toast.makeText(context, "快递 " + number + " 已到达!", Toast.LENGTH_LONG).show();
} else {
// 继续下一次轮询
Log.d(TAG, "快递未到达," + 10 + "秒后再次检查...");
handler.postDelayed(this, 10000); // 10秒查一次(演示用)
}
}
};
// 首次延迟10秒执行
handler.postDelayed(pollingTask, 10000);
}
}
package com.weishitechsub.kdcxqwb.utils;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.weishitechsub.kdcxqwb.R;
import com.weishitechsub.kdcxqwb.MainActivity;
public class PackageNotificationSender {
// 在类顶部定义 TAG,方便过滤日志
private static final String TAG = "MyCourierAdapter";
private static final String CHANNEL_ID = "delivery_reminder_channel";
private static final int NOTIFICATION_ID = 1000;
private final Context context;
public PackageNotificationSender(Context context) {
this.context = context.getApplicationContext();
createNotificationChannel();
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "快递提醒";
String description = "当快递到达时发出通知";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
public void sendPickupReminder(String number, String company) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
PendingIntent.FLAG_IMMUTABLE);
String title = "📦 快递待取件";
String content = "您的快递 " + number + "(" + company + ")已到达,请及时取件!";
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.mipmap.img_icon) // 替换为你自己的图标
.setContentTitle(title)
.setContentText(content)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL);
NotificationManagerCompat.from(context).notify(NOTIFICATION_ID + number.hashCode(), builder.build());
}
}
iv_remind这个控件有两个状态,一个是开启,一个是关闭,开启设置提醒,关闭的话就关闭提醒
最新发布