实现两个功能
1.仿淘宝淘口令 打开app时解析连接(如果复制得到的信息不是可直接使用的数据,那么还需要加一步拿到这些信息去后台获取具体信息,因为项目设计复制完就是一串地址,所以没做二次请求处理)
2.仿淘宝海报 保存图片到本地 打开app时解析图片中的二维码 得到消息(同上,如果不是可直接使用的则需要二次请求获取)
实现思路
1.文字分享信息(仿淘口令):打开app时会回调onResume onPostResume(onResume完全执行后执行) ,这里我将处理逻辑放到onPostResume中 ,回调时检测系统剪切板,如果有包含 自定义的信息("53iq"),则判定为分享信息,取出传递给弹窗
2.海报分享信息(仿淘宝海报):打开app时onPostResume方法中检查截屏和相册第一张图片,对比时间信息,取出最近的一张,得到path,转为bitmap对象解析出二维码信息,传递给弹窗
说明:项目设计中,要求同时检查到有海报信息和文字分享信息时,只展示海报信息,所以这里处理入口选择为海报信息处理,
二次进入重复检查到信息 解决方案(文字 ---> 弹窗被点击一次后 将剪切板信息置空) (海报-->检查上次提取到的时间比对是否是同一张图片 如果是则不弹窗 )
具体实现看代码吧
@Override
protected void onPostResume() {
Log.d("", "onPostResume: 回到了这里");
searchSharePic();//相册
super.onPostResume();
}
//----------------搜索本地图片------------------
private void searchSharePic(){
if (null != getLatestPhoto(MainActivity.this)) {
Pair<Long, String> pair = getLatestPhoto(MainActivity.this);
String path=pair.second;
String url=decodeQRCode(pathToBitmap(path));
Log.d("acp_catch 相册", "searchSharePic: path"+url);
Log.d("acp_catch 相册", "searchSharePic: first"+pair.first);
if (pic_pick == pair.first || null ==url) {
searchShareString();//剪切板
} else {
pic_pick = pair.first;
createShareDialog(url);
}
}
}
//------------本地图片path转bitmap
private Bitmap pathToBitmap(String path){
String fileName = path;
Bitmap bm = BitmapFactory.decodeFile(fileName);
return bm;
}
/**
* 清空剪贴板内容
*/
public void clearClipboard() {
ClipboardManager manager = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
if (manager != null) {
try {
manager.setPrimaryClip(manager.getPrimaryClip());
manager.setText(null);
} catch (Exception e) {
}
}
}
//-------------搜索剪切板 查询分享口令------------------
public void searchShareString(){
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
//无数据时直接返回
if (!clipboard.hasPrimaryClip()) {
return;
}
//如果是文本信息
if (clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
ClipData cdText = clipboard.getPrimaryClip();
ClipData.Item item = cdText.getItemAt(0);
//此处是TEXT文本信息
if (item.getText() != null) {
String str = item.getText().toString();
if (str.contains("53iq")) {
Log.d("acp_catch 剪切板", "onClick: "+str);
createShareDialog(str);//在这传入从剪切板拿到的网址
}
}
}
}
//-----------------------acp----分享弹窗--------------------
public void createShareDialog(final String url) {
final AlertDialog dialog = new AlertDialog.Builder(this).create();
View view = LayoutInflater.from(this).inflate(R.layout.dialog_acp_share, null);
dialog.setView(view);
dialog.show();
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.getWindow().setLayout(ScreenSizeUtils.getScreenWidth(this) * 4 / 5, WindowManager.LayoutParams.WRAP_CONTENT);
Button confirmBtn = (Button) view.findViewById(R.id.btn_dialog_acp_jump);
confirmBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("测试", "onClick: "+url);
String token = (String) SPUtils.get(MainActivity.this, Constans.DEVICE_TOKEN, "");
Intent intent = new Intent(MainActivity.this, DeviceControlActivity.class);
intent.putExtra("url", url+"&token="+token);
clearClipboard();
context.startActivity(intent);
dialog.dismiss();
}
});
Button rejectBtn = view.findViewById(R.id.btn_dialog_acp_reject);
rejectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
clearClipboard();
}
});
}
//--------------------获取最近的一张图片--------------
/**
* 获取相册中最新一张图片
*
* @param context
* @return
*/
public static Pair<Long, String> getLatestPhoto(Context context) {
//拍摄照片的地址
String CAMERA_IMAGE_BUCKET_NAME = Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera";
//截屏照片的地址
String SCREENSHOTS_IMAGE_BUCKET_NAME = getScreenshotsPath();
//拍摄照片的地址ID
String CAMERA_IMAGE_BUCKET_ID = getBucketId(CAMERA_IMAGE_BUCKET_NAME);
//截屏照片的地址ID
String SCREENSHOTS_IMAGE_BUCKET_ID = getBucketId(SCREENSHOTS_IMAGE_BUCKET_NAME);
//查询路径和修改时间
String[] projection = {MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DATE_MODIFIED};
//
String selection = MediaStore.Images.Media.BUCKET_ID + " = ?";
//
String[] selectionArgs = {CAMERA_IMAGE_BUCKET_ID};
String[] selectionArgsForScreenshots = {SCREENSHOTS_IMAGE_BUCKET_ID};
//检查camera文件夹,查询并排序
Pair<Long, String> cameraPair = null;
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
MediaStore.Files.FileColumns.DATE_MODIFIED + " DESC");
if (cursor.moveToFirst()) {
cameraPair = new Pair(cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED)),
cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)));
}
//检查Screenshots文件夹
Pair<Long, String> screenshotsPair = null;
//查询并排序
cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgsForScreenshots,
MediaStore.Files.FileColumns.DATE_MODIFIED + " DESC");
if (cursor.moveToFirst()) {
screenshotsPair = new Pair(cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED)),
cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)));
}
if (!cursor.isClosed()) {
cursor.close();
}
//对比
if (cameraPair != null && screenshotsPair != null) {
if (cameraPair.first > screenshotsPair.first) {
screenshotsPair = null;
return cameraPair;
} else {
cameraPair = null;
return screenshotsPair;
}
} else if (cameraPair != null && screenshotsPair == null) {
return cameraPair;
} else if (cameraPair == null && screenshotsPair != null) {
return screenshotsPair;
}
return null;
}
private static String getBucketId(String path) {
return String.valueOf(path.toLowerCase().hashCode());
}
/**
* 获取截图路径
* @return
*/
public static String getScreenshotsPath(){
String path = Environment.getExternalStorageDirectory().toString() + "/DCIM/Screenshots";
File file = new File(path);
if(!file.exists()){
path = Environment.getExternalStorageDirectory().toString() + "/Pictures/Screenshots";
}
file = null;
return path;
}
//----------解析从相册选取的图片---------
/**
* 解析图片
*
* @param srcBitmap
* @return
*/
public static String decodeQRCode(Bitmap srcBitmap) {
// 解码的参数
Hashtable<DecodeHintType, Object> hints = new Hashtable<>(2);
// 可以解析的编码类型
Vector<BarcodeFormat> decodeFormats = new Vector<>();
if (decodeFormats.isEmpty()) {
decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
}
hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
Result result = null;
int width = srcBitmap.getWidth();
int height = srcBitmap.getHeight();
int[] pixels = new int[width * height];
srcBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
//新建一个RGBLuminanceSource对象
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
//将图片转换成二进制图片
BinaryBitmap binaryBitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source));
QRCodeReader reader = new QRCodeReader();//初始化解析对象
try {
result = reader.decode(binaryBitmap, hints);//开始解析
} catch (NotFoundException | ChecksumException | FormatException e) {
e.printStackTrace();
}
if (result != null) {
return result.getText();
}
return null;
}