仿淘宝 打开app时识别淘口令和解析保存到本地的带二维码图片的网址

实现两个功能

  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;
    }


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值