WebView 實現(xiàn)長按保存圖片

最近在做一個紅包活動,要求實現(xiàn)長按圖片保存到相冊以及分享的功能。查詢了網(wǎng)上的一些實現(xiàn)后,整理成這篇文章。

主要步驟如下:

  1. WebView添加OnLongClickListener
  2. 識別長按的元素類型,如果是圖片,彈出AlertDialog
  3. 選擇保存或是分享圖片

代碼如下:

webView.setOnLongClickListener(v -> {
            final WebView.HitTestResult hitTestResult = webView.getHitTestResult();
            // 如果是圖片類型或者是帶有圖片鏈接的類型
            if (hitTestResult.getType() == WebView.HitTestResult.IMAGE_TYPE ||
                    hitTestResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                // 彈出保存圖片的對話框
                new AlertDialog.Builder(WebActivity.this)
                        .setItems(new String[]{"保存圖片到本地", "分享圖片"}, (dialog, which) -> {
                            String pic = hitTestResult.getExtra();//獲取圖片
                            switch (which) {
                                case 0:
                                    //保存圖片到相冊
                                    new Thread(() -> saveImage(pic)).start();
                                    break;
                                case 1:
                                    // 分享圖片,這里用RxJava處理異步
                                    Observable.create((Observable.OnSubscribe<Bitmap>) subscriber -> subscriber.onNext(webData2bitmap(pic)))
                                            .subscribeOn(Schedulers.computation())
                                            .observeOn(AndroidSchedulers.mainThread())
                                            .subscribe(bitmap -> {
                                                try {
                                                    Intent intent = new Intent(Intent.ACTION_SEND);
                                                    intent.setType("image/*");
                                                    intent.putExtra(Intent.EXTRA_STREAM, getImageUri(WebActivity.this, bitmap));
                                                    startActivity(Intent.createChooser(intent, "分享圖片"));
                                                } catch (Exception e) {
                                                    e.printStackTrace();
                                                    Util.makeText(WebActivity.this, "分享失敗");
                                                }
                                            }, throwable -> {
                                                throwable.printStackTrace();
                                                Util.makeText(WebActivity.this, "分享失敗");
                                            });
                                    break;
                            }
                        })
                        .show();
                return true;
            }
            return false;//保持長按可以復(fù)制文字
        });

public void saveImage(String data) {
    try {
        Bitmap bitmap = webData2bitmap(data);
        if (bitmap != null) {
            save2Album(bitmap, new SimpleDateFormat("SXS_yyyyMMddHHmmss", Locale.getDefault()).format(new Date()) + ".jpg");
        } else {
            runOnUiThread(() -> Toast.makeText(WebActivity.this, "保存失敗", Toast.LENGTH_SHORT).show());
        }
    } catch (Exception e) {
        runOnUiThread(() -> Toast.makeText(WebActivity.this, "保存失敗", Toast.LENGTH_SHORT).show());
        e.printStackTrace();
    }
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public Bitmap webData2bitmap(String data) {
    byte[] imageBytes = Base64.decode(data.split(",")[1], Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}

private void save2Album(Bitmap bitmap, String fileName) {
    File file = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM), fileName);
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
        runOnUiThread(() -> {
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
            Util.makeText(WebActivity.this, "保存成功", Toast.LENGTH_SHORT);
        });
    } catch (Exception e) {
        runOnUiThread(() -> Util.makeText(WebActivity.this, "保存失敗", Toast.LENGTH_SHORT));
        e.printStackTrace();
    } finally {
        try {
            fos.close();
        } catch (Exception ignored) {
        }
    }
}

網(wǎng)上別的很多文章中,hitTestResult.getExtra()獲取到的是圖片的Url網(wǎng)址,而我們前端頁面獲取到的是base64編碼后的data字段,需要將data還原成字節(jié)數(shù)組,再解碼成Bitmap才能保存或者分享(data字段帶有格式信息,也可直接將解碼后的字節(jié)數(shù)組寫入磁盤)。

參考:
WebView實現(xiàn)長按保存圖片 長按識別二維碼
Android webview長按圖片保存到本地
Android 的WebView長按保存圖片

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容