Android 桌面快捷方式兼容8.0(仿支付宝)

  1. 需求
    为对应详情添加快捷桌面;已id作为唯一性
    需要数据;详情id;图片封面;name;跳转url
    此处根据需求加了两个弹窗(具体逻辑可跟具自己需要更改)

  2. 实现逻辑(参考支付宝/微信方式)

    ● 不做主动检测权限(经调研:1无法准确主动获取是否已开启权限;2检测无疑增加开发量且各型号手机获取有差异;3小米一加等不用手动开启可直接添加;)
    ● 点击即提示成功并附带引导说明(成功/失败/已添加)
    ● 可成功走后续操作/失败仅展示提示

    ● 了解详情开启权限图文介绍可参考支付宝微信

  3. 添加失败问题查找:
    了解详情链接参考各机型如何打开快捷方式权限
    https://render.alipay.com/p/f/fd-jsygbvgj/index.html

  4. 添加权限

<!-- 快捷方式开始 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
  1. 相关代码

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;

import androidx.annotation.NonNull;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;

import java.util.List;


/**
 * author : zhanggf
 * date   : 2021/1/13 3:58 PM
 * desc   : 添加到桌面快捷方式
 */
public class ShortCutUtils {

    /**
     * 添加桌面快捷方式入口提示弹窗
     *
     * @param mContext
     * @param model
     */
    public static void showDialog(Context mContext, ShortCutModel model) {
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
            ToastUtil.show(mContext,"您的安卓版本过低,需升级后可使用桌面快捷方式功能");
            return;
        }
        if (null == model) {
            return;
        }
        //TODO 弹窗已删除-直接判断是否存在及添加
       if (!isShortcutExit(mContext, model.shortcutId)) {
                    getImageBitmap(model.shortcutImage, new ActionCallback() {
                        @Override
                        public void onAction(Bitmap bitmap) {
                            createShortCut(mContext, model, bitmap);
                        }
                    });
                } else {
                    ToastUtil.show(mContext, model.shortcutName + "快捷方式已存在");
                }
    }

    /**
     * 快捷方式Shortcut兼容8.0及以上
     * 快捷桌面id /快捷名称/快捷图片
     *
     * @param mContext
     */
    public static void createShortCut(Context mContext, ShortCutModel model, Bitmap bitmap) {
        if (null == bitmap) {
            bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher);
        }
        //8.0 及以上快捷方式Shortcut
        if (ShortcutManagerCompat.isRequestPinShortcutSupported(mContext)) {
            try {
                ShortcutInfoCompat info = new ShortcutInfoCompat.Builder(mContext, model.shortcutId)
                        .setIcon(IconCompat.createWithAdaptiveBitmap(bitmap))
                        .setShortLabel(model.shortcutName)
                        .setIntent(navigatorToIntent(mContext, model))
                        .build();
                //当添加快捷方式的确认弹框弹出来时,将被回调
                PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(mContext, ShortcutReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
                ShortcutManagerCompat.requestPinShortcut(mContext, info, shortcutCallbackIntent.getIntentSender());
                boolean shortcutTipHidden = (boolean) SharedPreferencesUtil.getData(mContext, SHORT_CUT_TIP_HIDDEN, false);
                if (!shortcutTipHidden) {//不再提示
                    showResultDialog(mContext);
                }
            } catch (Exception e) {
            }
        }
    }


    /**
     * 快捷跳转
     *
     * @param mContext
     * @param model
     * @return
     */
    private static Intent navigatorToIntent(Context mContext,ShortCutModel model) {
        //对应Activity清单文件设置 android:exported="true" 支持其它应用调用当前组件。
        //否则8.0以下跳转提示未安装应用
        //TODO  跳转到对应详情,此处因为需要先跳转至首页再进行分发进详情
        String url = null != model ? model.shortcutUrl : "";
        Intent intent = new Intent(mContext, MainActivity.class);
        intent.setAction(Intent.ACTION_VIEW);
        intent.putExtra(IntentConstants.Key.SHORTCUT_URL, url);
        return intent;
    }


    public class ShortcutReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            LogUtil.d("成功回调");
        }
    }


    /**
     * 添加桌面快捷方式后弹窗
     * 成功/失败
     *
     * @param mContext
     */
    private static String SHORT_CUT_TIP_HIDDEN = "shortcutTipHiddle";

    private static void showResultDialog(Context mContext) {
    //TODO 提示弹窗使用项目已有即可,为保证逻辑完整未删除
        MyAlertDialog alert = new MyAlertDialog((Activity) mContext);
        alert.setTitle("已尝试添加到桌面");
        alert.setMessage("若添加失败,请前往系统设置,为XXX打开“创建桌面快捷方式”的权限");
        alert.hiddenCloseButton();
        alert.setOutsideTouchable(true);
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.view_dialog_again, null, false);
        CheckBox cbAgain = view.findViewById(R.id.cb_again);
        cbAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                SharedPreferencesUtil.saveData(mContext, SHORT_CUT_TIP_HIDDEN, b);
            }
        });
        alert.setButtonView(view);
        alert.setPositiveButton("了解详情", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                //开启权限介绍跳转待开发???
                alert.dismiss();
            }
        });
        alert.setNegativeButton("返回", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                alert.dismiss();
            }
        });
        alert.show();
    }


    /**
     * 根据id判断快捷方式是否存在
     *
     * @param context
     * @param id
     * @return
     */
    private static boolean isShortcutExit(@NonNull Context context, @NonNull String id) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
            ShortcutManager mShortcutManager =
                    context.getSystemService(ShortcutManager.class);
            if (mShortcutManager == null) {
                return false;
            }

            List<ShortcutInfo> pinnedShortcuts =
                    mShortcutManager.getPinnedShortcuts();
            for (ShortcutInfo pinnedShortcut : pinnedShortcuts) {
                if (pinnedShortcut.getId().equals(id)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 下载图片
     *	图片拉伸需要做正方形截取???有需要自行找方法处理
     * @param imageUrl
     * @param action
     */
    private static void getImageBitmap(String imageUrl, ActionCallback action) {
    //TODO 可使用自己项目中下载方式即可:如通过glide下载得到bitmap
        GlideHelper.downloadFormatImage(imageUrl, 500,
                new GlideHelper.BitmapLoadListener() {
                    @Override
                    public void onSuccess(Bitmap bitmap, String url) {
                        if (action != null) {
                            action.onAction(bitmap);
                        }
                    }
                    @Override
                    public void onFail(String url) {
                        if (action != null) {
                            action.onAction(null);
                        }
                    }
                });
    }

    public interface ActionCallback {
        void onAction(Bitmap bitmap);
    }
}
//快捷需要参数
 public static class ShortCutModel implements Serializable {
        public String shortcutId;
        public String shortcutName;
        public String shortcutImage;
        public String shortcutUrl;

    }

//首页分发跳转有需要可参考

在这里插入代码片

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //.......
        shortCutIntent(getIntent());
    }

  @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
		setIntent(intent);
        shortCutIntent(getIntent());
    }

 /**
     * 从桌面快捷方式跳转
     * @param intent
     */
    private void shortCutIntent(Intent intent){
        if (null == intent){
            return;
        }
        String showUrl = intent.getStringExtra(IntentConstants.Key.SHORTCUT_URL);
        if (!TextUtils.isEmpty(showUrl)){
           //跳转详情????
           
        }

    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值