8

webviewに表示された画像をローカルストレージに保存したいのですが、webviewは表示された画像をキャッシュする必要があります。キャッシュされた画像にアクセスしてストレージに保存するにはどうすればよいですか?

4

4 に答える 4

2
WebView webView = new WebView(this);
//your image is in webview

Picture picture = webView.capturePicture();
Canvas canvas = new Canvas();
picture.draw(canvas);
Bitmap image = Bitmap.createBitmap(picture.getWidth(),
picture.getHeight(),Config.ARGB_8888);
canvas.drawBitmap(mimage, 0, 0, null);
if(image != null) {
    ByteArrayOutputStream mByteArrayOS = new
    ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 90, mByteArrayOS);
    try {
        fos = openFileOutput("image.jpg", MODE_WORLD_WRITEABLE);
        fos.write(mByteArrayOS.toByteArray());
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

上記を試して、webViewから画像をキャプチャしてください

于 2012-04-15T03:23:46.967 に答える
2

次に、WebViewClientをWebViewに設定し、 shouldOverrideUrlLoadingメソッドとonLoadResourceメソッドをオーバーライドする必要があります。簡単な例を挙げましょう。

WebView yourWebView; // initialize it as always...
// this is the funny part:
yourWebView.setWebViewClient(yourWebClient);

// somewhere on your code...
WebViewClient yourWebClient = new WebViewClient(){
    // you tell the webclient you want to catch when a url is about to load
    @Override
    public boolean shouldOverrideUrlLoading(WebView  view, String  url){
        return true;
    }
    // here you execute an action when the URL you want is about to load
    @Override
    public void onLoadResource(WebView  view, String  url){
        if( url.equals("http://cnn.com") ){
            // do whatever you want
           //download the image from url and save it whereever you want
        }
    }
}
于 2012-04-15T04:13:44.930 に答える
0

私は上からのコードを使用しましたが、それは「機能しました」が、黒い画像を生成するだけだったので、ここで数時間後に私の修正があります。これで、非推奨のリスクやパスの問題なしに外部SDカードに書き込みます...

public void captureWV() {
    Picture picture = webview.capturePicture();
    Bitmap image = Bitmap.createBitmap(picture.getWidth(),picture.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(image);
    picture.draw(canvas);
    if (image != null) {
        ByteArrayOutputStream mByteArrayOS = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 90, mByteArrayOS);
        try {
            File sdCard = Environment.getExternalStorageDirectory();
            File dir = new File(sdCard.getAbsolutePath());
            File file = new File(dir, "filename.jpg");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(mByteArrayOS.toByteArray());
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

これが私のMainActivityの始まりです

public class MainActivity extends Activity {
private static final String URL = "http://punto.gt"; //your website
WebView webview;
// your code here
}
于 2013-02-01T07:14:05.770 に答える
0

たぶん、ファイルがキャッシュファイルに存在するかどうかを確認する必要があります。

  1. urlのハッシュキーを取得します。

    MessageDigest md;
    try {
        md = MessageDigest.getInstance(“SHA-1”);
    } catch (NoSuchAlgorithmException e) {
        return "";
    }
    md.update(url.getBytes());
    byte b[] = md.digest();
    

    Chromiumは8バイト前のハッシュコードを使用します。だから多分あなたはするべきです

    int i;
    StringBuffer buf = new StringBuffer("");
    for (int offset = 0; offset < 8; ++offset) {
        i = b[8 - offset - 1];
        if (i < 0)
            i += 256;
        if (i < 16)
            buf.append("0");
        buf.append(Integer.toHexString(i));
    }
    

    次に、ハッシュ文字列を取得します。クロムのキャッシュファイル名はhash+"_" + fileindexであり、通常、ファイル名はゼロです。したがって、ファイル名はhash_0である必要があります。

2キャッシュファイルからコンテンツを取得します。

try {
    input = new FileInputStream(filename);
    FileOutputStream output = new FileOutputStream("/sdcard/img.jpg"); // save to this file
    input.skip(12); // length of key
    int len = input.read() + 12; 
    input.skip(len - 1); // skip the  key and the header
    int read;
    // magic  0xd8410d97456ffaf4;
    int flag = 0;
    while ((read = input.read()) != -1) {
          if ((flag == 0 && read == 0xd8) ||
          (flag == 1 && read == 0x41) ||
          (flag == 2 && read == 0x0d) ||
          (flag == 3 && read == 0x97) ||
          (flag == 4 && read == 0x45) ||
          (flag == 5 && read == 0x6f) ||
          (flag == 6 && read == 0xfa) ||
          (flag == 7 && read == 0xf4)) {
          flag++;
          if(flag == 8) {
              // success
              break;
          }
      } else if (flag > 0) {
          flag = 0;
      }
      output.write(read);
    }
    input.close();
    output.close();
    } catch (Exception e) {
    }
    return true;
} catch (Exception e) {
    return false;
}
于 2018-07-30T09:17:24.227 に答える