-
需求
为对应详情添加快捷桌面;已id作为唯一性
需要数据;详情id;图片封面;name;跳转url
此处根据需求加了两个弹窗(具体逻辑可跟具自己需要更改) -
实现逻辑(参考支付宝/微信方式)
● 不做主动检测权限(经调研:1无法准确主动获取是否已开启权限;2检测无疑增加开发量且各型号手机获取有差异;3小米一加等不用手动开启可直接添加;)
● 点击即提示成功并附带引导说明(成功/失败/已添加)
● 可成功走后续操作/失败仅展示提示
● 了解详情开启权限图文介绍可参考支付宝微信 -
添加失败问题查找:
了解详情链接参考各机型如何打开快捷方式权限
https://render.alipay.com/p/f/fd-jsygbvgj/index.html -
添加权限
<!-- 快捷方式开始 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
- 相关代码
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)){
//跳转详情????
}
}