0

好的,所以我尝试在我的 webview 活动中显示的网页的按钮单击时捕获 webview,并将其保存到 sd 卡。

我的清单中有写入外部存储的正确权限,并且所有 webview 功能都工作得很好,就在我尝试捕获图像时。

 public void onClick(View v) {
    switch(v.getId()) {

            case R.id.button1:
                WebViewClientDemoActivity.web.goBack(); 
                break;

        case R.id.button2:
                WebViewClientDemoActivity.web.goForward();
                break;

            case R.id.button3:
                WebViewClientDemoActivity.web.capturePicture();
                //Capture Picture
            Picture picture = WebViewClientDemoActivity.web.capturePicture();
            //Create a new canvas
            Canvas mCanvas = new Canvas();
            //Draw the Picture into the Canvas
            picture.draw(mCanvas);
            //Create a Bitmap
            Bitmap sreenshot = Bitmap.createBitmap(picture.getWidth(),
            picture.getHeight(),Config.ARGB_8888);
            //copy the content fron Canvas to Bitmap
            //mCanvas.drawBitmap(mBitmapScreenshot, 0, 0, null);
            mCanvas.drawBitmap(sreenshot, 0, 0, null);
            //Save the Bitmap to local filesystem
            if(sreenshot != null) {
                   ByteArrayOutputStream mByteArrayOpStream = new
            ByteArrayOutputStream();
                    sreenshot.compress(Bitmap.CompressFormat.JPEG, 90,
            mByteArrayOpStream);

                try {
                    File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Enlighten/Images");
                    folder.mkdirs();
                    // create a File object for the parent directory
                    File outputFile = new File(folder, "enlighten.jpg");
                    // now attach the OutputStream to the file object, instead of a String representation
                    FileOutputStream fos = new FileOutputStream(outputFile);
                    fos.write(mByteArrayOpStream.toByteArray());
                    fos.close();
                    Toast.makeText(WebViewClientDemoActivity.this, "File Created", Toast.LENGTH_SHORT).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    Toast.makeText(WebViewClientDemoActivity.this, "File Not Found", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    e.printStackTrace();
                }               

我收到此错误消息。(更新)

10-15 11:33:10.336: W/System.err(20577): java.io.FileNotFoundException: /mnt/sdcard/Enlighten/Images/enlighten.jpg: open failed: ENOENT (No such file or directory)
10-15 11:33:10.336: W/System.err(20577):    at libcore.io.IoBridge.open(IoBridge.java:406)
10-15 11:33:10.336: W/System.err(20577):    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
10-15 11:33:10.336: W/System.err(20577):    at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
10-15 11:33:10.336: W/System.err(20577):    at com.jaisonbrooks.enlighten.WebViewClientDemoActivity.onClick(WebViewClientDemoActivity.java:374)
10-15 11:33:10.336: W/System.err(20577):    at android.view.View.performClick(View.java:3565)
10-15 11:33:10.336: W/System.err(20577):    at android.view.View$PerformClick.run(View.java:14165)
10-15 11:33:10.336: W/System.err(20577):    at android.os.Handler.handleCallback(Handler.java:605)
10-15 11:33:10.336: W/System.err(20577):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 11:33:10.336: W/System.err(20577):    at android.os.Looper.loop(Looper.java:137)
10-15 11:33:10.336: W/System.err(20577):    at android.app.ActivityThread.main(ActivityThread.java:4517)
10-15 11:33:10.336: W/System.err(20577):    at java.lang.reflect.Method.invokeNative(Native Method)
10-15 11:33:10.346: W/System.err(20577):    at java.lang.reflect.Method.invoke(Method.java:511)
10-15 11:33:10.346: W/System.err(20577):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
10-15 11:33:10.346: W/System.err(20577):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
10-15 11:33:10.346: W/System.err(20577):    at dalvik.system.NativeStart.main(Native Method)
10-15 11:33:10.346: W/System.err(20577): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
10-15 11:33:10.346: W/System.err(20577):    at libcore.io.Posix.open(Native Method)
10-15 11:33:10.346: W/System.err(20577):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
10-15 11:33:10.346: W/System.err(20577):    at libcore.io.IoBridge.open(IoBridge.java:390)
4

2 回答 2

2

openFileOutput()只需要文件名,没有路径分隔符,因为它假定文件将在应用程序的私有数据区域中创建(如果我的记忆没有欺骗我,那么它应该是 /data/data/[your app包名]/文件/)。

要在 sdcard 上创建文件,您可以直接使用 FileOutputStream,请参见此处的示例

另一个建议是不要使用像 /mnt/sdcard 这样的硬编码路径,因为 sdcard 的绝对路径可能在不同的设备上有所不同,而应该使用Environment.getExternalStorageDirectory()

于 2012-10-15T03:43:14.243 回答
1

我用这段代码解决了我的问题,所以它从菜单内部截屏

public boolean onOptionsItemSelected (MenuItem item){ 
        // Called when you tap a menu item
            switch (item.getItemId()){
            case R.id.settings_capture:
                item.setIcon(R.drawable.capture);                   
                //Resize the webview to the height of the webpage
                int pageHeight = web.getContentHeight();
                LayoutParams browserParams = web.getLayoutParams();
                web.setLayoutParams(new     LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, pageHeight));

                //Capture the webview as a bitmap
                web.setDrawingCacheEnabled(true);
                Bitmap bitmap =    Bitmap.createBitmap(web.getDrawingCache());
                web.setDrawingCacheEnabled(false);

                //Create the filename to use
                String randomFilenamepart = String.valueOf(new   SecureRandom().nextInt(1000000));
                String filename =   Environment.getExternalStorageDirectory().toString() + "/Enlighten_Mobile_" +   randomFilenamepart + ".jpg";

                File imageFile = new File(filename);
                //Stream the file out to external storage as a JPEG
                OutputStream fout = null;
                try {
                    fout = new FileOutputStream(imageFile);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
                    fout.flush();
                    fout.close();
                    Toast.makeText(WebViewClientDemoActivity.this,   "Screen Capture Saved!\n\nImage Saved at location : /sdcard\n\nSaved As:   Enlighten_Mobile_xxxxx.jpg", Toast.LENGTH_LONG).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    Toast.makeText(WebViewClientDemoActivity.this,   "Problem with Capturing Image or Location to Store Image", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    web.setLayoutParams(browserParams);
                }
                return true;
于 2012-10-16T06:36:12.503 回答