屏幕截图显示黑色

时间:2013-05-17 13:33:05

标签: android screenshot

我正在拍摄快照并创建缩略图然后分享此图片。但缩略图显示全黑。我使用了以下代码

Bitmap bitmap;
View v1 = v.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
String url = Images.Media.insertImage(
mContext.getContentResolver(), bitmap, "title", null);

有谁能告诉我这段代码有什么问题。

修改

private View.OnClickListener shareListener = new View.OnClickListener() {
        public void onClick(View v) {
            Bitmap bitmap;
            View v1 = v.getRootView();
            v1.setDrawingCacheEnabled(true);
            bitmap = Bitmap.createBitmap(v1.getDrawingCache());
            String url = Images.Media.insertImage(
                    mContext.getContentResolver(), bitmap, "title", null);
            v1.setDrawingCacheEnabled(false);
            Activity activity = (Activity) getContext();
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("image/jpeg");
            share.putExtra(Intent.EXTRA_STREAM, Uri.parse(url));
            activity.startActivity(Intent.createChooser(share,
                    "Share"));

        }

    };

黑色图片 enter image description here

5 个答案:

答案 0 :(得分:3)

使用以下可能适合您的代码。感谢

SCREENSHOTS_LOCATIONS = Environment.getExternalStorageDirectory().toString() + "/screenshots/";
// Get root view
View view = activity.getWindow().getDecorView().getRootView();
// Create the bitmap to use to draw the screenshot
final Bitmap bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);

// Get current theme to know which background to use
final Theme theme = activity.getTheme();
final TypedArray ta = theme
    .obtainStyledAttributes(new int[] { android.R.attr.windowBackground });
final int res = ta.getResourceId(0, 0);
final Drawable background = activity.getResources().getDrawable(res);

// Draw background
background.draw(canvas);

// Draw views
view.draw(canvas);

// Save the screenshot to the file system
FileOutputStream fos = null;
try {
    final File sddir = new File(SCREENSHOTS_LOCATIONS);
    if (!sddir.exists()) {
        sddir.mkdirs();
    }
    fos = new FileOutputStream(SCREENSHOTS_LOCATIONS
            + System.currentTimeMillis() + ".jpg");
    if (fos != null) {
        if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos)) {
            Log.d("ScreenShot", "Compress/Write failed");
        }
        fos.flush();
        fos.close();
    }

} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

答案 1 :(得分:0)

v1.setDrawingCacheEnabled(true);

// this is the important code :)  
// Without it the view will have a dimension of 0,0 and the bitmap will be null          
v1.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
v1.layout(0, 0, v1.getMeasuredWidth(), v1.getMeasuredHeight()); 
//Forces the drawing cache to be built if the drawing cache is invalid.
v1.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false); // clear drawing cache

答案 2 :(得分:0)

尝试应用此代码:

private File takeScreenshot(boolean showToast) {
    View v = getWindow().getDecorView();

    v.setDrawingCacheEnabled(true);
    Bitmap cachedBitmap = v.getDrawingCache();
    Bitmap copyBitmap = cachedBitmap.copy(Bitmap.Config.RGB_565, true);
    FileOutputStream output = null;
    File file = null;
    try {
        File path = Places.getScreenshotFolder();
        Calendar cal = Calendar.getInstance();

        file = new File(path,

        cal.get(Calendar.YEAR) + "_" + (1 + cal.get(Calendar.MONTH)) + "_"
                + cal.get(Calendar.DAY_OF_MONTH) + "_"
                + cal.get(Calendar.HOUR_OF_DAY) + "_"
                + cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)
                + ".png");
        output = new FileOutputStream(file);
        copyBitmap.compress(CompressFormat.PNG, 100, output);
    } catch (FileNotFoundException e) {
        file = null;
        e.printStackTrace();
    } finally {
        if (output != null) {
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    if (file != null) {
        if (showToast)
            Toast.makeText(getApplicationContext(),
                    "Saved " + file.getAbsolutePath(),
                    Toast.LENGTH_LONG).show();
        // sending a broadcast to the media scanner so it will scan the new
        // screenshot.
        Intent requestScan = new Intent(
                Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        requestScan.setData(Uri.fromFile(file));
        sendBroadcast(requestScan);

        return file;
    } else {
        return null;
    }
}

这对我来说很有效。希望这会对你有所帮助。

答案 3 :(得分:0)

可能发生这种情况是因为您的区域被标记为安全。显示图标时,显示内容的视图显示为黑色,因为它是安全的:

  

用户可能会在屏幕上看到空白区域而不是安全表面或受保护缓冲区的内容。

http://developer.android.com/reference/android/view/Display.html#FLAG_SECURE

答案 4 :(得分:-1)

试试这段代码..它应该是有用的。

linearLayout.setDrawingCacheEnabled(true);
    linearLayout.measure(MeasureSpec.makeMeasureSpec(linearLayout.getWidth(), MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(linearLayout.getHeight(), MeasureSpec.EXACTLY));
    linearLayout.layout(0, 0, linearLayout.getMeasuredWidth(), linearLayout.getMeasuredHeight());

    Bitmap b1 =linearLayout.getDrawingCache();


    Bitmap bigbitmap    = Bitmap.createBitmap(linearLayout.getMeasuredWidth(), linearLayout.getMeasuredHeight(), Bitmap.Config.ARGB_4444);
    Canvas bigcanvas    = new Canvas(bigbitmap);

    Paint paint = new Paint();
    bigcanvas.drawBitmap(b1, 0, 0, paint);


    int Measuredwidth = 0;
    int Measuredheight = 0;
    Point size = new Point();
    WindowManager w = getWindowManager();

      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
            w.getDefaultDisplay().getSize(size);

            Measuredwidth = size.x;
            Measuredheight = size.y; 
          }else{
            Display d = w.getDefaultDisplay(); 
            Measuredwidth = d.getWidth(); 
            Measuredheight = d.getHeight(); 
          }
      Log.e(DEB_TAG, ""+Measuredwidth);
      Log.e(DEB_TAG, ""+Measuredheight);
     bigbitmap = Bitmap.createScaledBitmap(bigbitmap, Measuredwidth, Measuredheight, true);

     visiterCoverFlow.setScreenCache(bigbitmap);