2016-04-27 81 views
3

我一直在研究如何在android中以编程方式截取屏幕截图,但是当截屏时,我会捕获工具栏和黑屏而不是屏幕上实际显示的内容。截图Android中的黑色

我也尝试在我为Google地图创建的自定义InfoWindow布局中截取特定的TextView。但是,这会在下面的第二行创建一个空指针异常。

TextView v1 = (TextView)findViewById(R.id.tv_code); 
v1.setDrawingCacheEnabled(true); 

反正有任何实际截图的是在屏幕上,而无需安装Android的屏幕截图库或定制的信息窗口布局

这是我的截图方法中的截图一个TextView:

/** 
* Method to take a screenshot programmatically 
*/ 
private void takeScreenshot(){ 
    try { 
     //TextView I could screenshot instead of the whole screen: 
     //TextView v1 = (TextView)findViewById(R.id.tv_code); 

     View v1 = getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 


     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
     File f = new File(Environment.getExternalStorageDirectory() 
       + File.separator + "test.jpg"); 

     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     fo.flush(); 
     fo.close(); 

     MediaStore.Images.Media.insertImage(getContentResolver(), f.getAbsolutePath(), f.getName(), f.getName()); 
     Log.d("debug", "Screenshot saved to gallery"); 

     Toast.makeText(HuntActivity.this,"Code Saved!",Toast.LENGTH_LONG).show(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

编辑:我已经改变了方法,以源提供的一个

How can i take/merge screen shot of Google map v2 and layout of xml both programmatically?

但是它并没有截取任何东西。

public void captureMapScreen() { 
    GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() { 

     @Override 
     public void onSnapshotReady(Bitmap snapshot) { 
      try { 
       View mView = getWindow().getDecorView().getRootView(); 
       mView.setDrawingCacheEnabled(true); 
       Bitmap backBitmap = mView.getDrawingCache(); 
       Bitmap bmOverlay = Bitmap.createBitmap(
         backBitmap.getWidth(), backBitmap.getHeight(), 
         backBitmap.getConfig()); 

       Canvas canvas = new Canvas(bmOverlay); 
       canvas.drawBitmap(backBitmap, 0, 0, null); 
       canvas.drawBitmap(snapshot, new Matrix(), null); 

       FileOutputStream out = new FileOutputStream(
         Environment.getExternalStorageDirectory() 
           + "/" 
           + System.currentTimeMillis() + ".jpg"); 

       bmOverlay.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    mMap.snapshot(callback); 
} 
+1

是你想要的吗? [链接](http://stackoverflow.com/questions/18309625/how-can-i-take-merge-screen-shot-of-google-map-v2-and-layout-of-xml-both-program) – calvinfly

+0

检查你的权限你有包括 Lampard

+0

@CrazyAndroid已经在清单 – user3586417

回答

1

我已经想通了!

/** 
* Method to take a screenshot programmatically 
*/ 
private void takeScreenshot(){ 
    GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() { 
     @Override 
     public void onSnapshotReady(Bitmap bitmap) { 
      Bitmap b = bitmap; 
      String timeStamp = new SimpleDateFormat(
        "yyyyMMdd_HHmmss", Locale.getDefault()) 
        .format(new java.util.Date()); 

      String filepath = timeStamp + ".jpg"; 

      try{ 
       OutputStream fout = null; 
       fout = openFileOutput(filepath,MODE_WORLD_READABLE); 
       bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout); 
       fout.flush(); 
       fout.close(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      saveImage(filepath); 
     } 
    }; 
    mMap.snapshot(callback); 
} 

/** 
* Method to save the screenshot image 
* @param filePath the file path 
*/ 
public void saveImage(String filePath) 
{ 
    File file = this.getFileStreamPath(filePath); 

    if(!filePath.equals("")) 
    { 
     final ContentValues values = new ContentValues(2); 
     values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
     values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath()); 
     final Uri contentUriFile = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
     Toast.makeText(HuntActivity.this,"Code Saved to files!",Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 
     System.out.println("ERROR"); 
    } 
} 

我已经调整了这个链接的代码,所以它不会共享,而只是保存图像。

Capture screen shot of GoogleMap Android API V2

感谢大家的帮助

0

请与下面的代码尝试:

private void takeScreenshot(){ 
    try { 
     //TextView I could screenshot instead of the whole screen: 
     //TextView v1 = (TextView)findViewById(R.id.tv_code); 
     Bitmap bitmap = null; 
     Bitmap bitmap1 = null; 
     View v1 = getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     try { 
     if (bitmap != null) 
      bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, 
        v1.getWidth(), v1.getHeight()); 
     } catch (OutOfMemoryError e) { 
      e.printStackTrace(); 
     } 
     v1.setDrawingCacheEnabled(false); 


     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     bitmap1.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
     File f = new File(Environment.getExternalStorageDirectory() 
       + File.separator + "test.jpg"); 

     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     fo.flush(); 
     fo.close(); 

     MediaStore.Images.Media.insertImage(getContentResolver(), f.getAbsolutePath(), f.getName(), f.getName()); 
     Log.d("debug", "Screenshot saved to gallery"); 

     Toast.makeText(HuntActivity.this,"Code Saved!",Toast.LENGTH_LONG).show(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

对我来说,这仍然会产生一个黑色的截图。这是屏幕截图时的Android监视器。 http:// pastebin。com/Tx5q9AHV – user3586417

0

使用此代码

private void takeScreenshot() { 
    AsyncTask<Void, Void, Void> asyc = new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      objUsefullData.showProgress("Please wait", ""); 

     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       // create bitmap screen capture 
       View v1 = getWindow().getDecorView().getRootView(); 
       v1.setDrawingCacheEnabled(true); 
       bitmapscreen_shot = Bitmap.createBitmap(v1 
         .getDrawingCache()); 
       v1.setDrawingCacheEnabled(false); 
       String state = Environment.getExternalStorageState(); 
       File folder = null; 
       if (state.contains(Environment.MEDIA_MOUNTED)) { 
        folder = new File(
          Environment.getExternalStorageDirectory() 
            + "/piccapella"); 
       } else { 
        folder = new File(
          Environment.getExternalStorageDirectory() 
            + "/piccapella"); 
       } 
       boolean success = true; 
       if (!folder.exists()) { 
        success = folder.mkdirs(); 
       } 
       if (success) { 
        // Create a media file name 
        String timeStamp = new SimpleDateFormat(
          "yyyyMMdd_HHmmss", Locale.getDefault()) 
          .format(new java.util.Date()); 
        imageFile = new File(folder.getAbsolutePath() 
          + File.separator + "IMG_" + timeStamp + ".jpg"); 
        /* 
        * Toast.makeText(AddTextActivity.this, 
        * "saved Image path" + "" + imageFile, 
        * Toast.LENGTH_SHORT) .show(); 
        */ 
        imageFile.createNewFile(); 
       } else { 
        /* 
        * Toast.makeText(AddTextActivity.this, 
        * "Image Not saved", Toast.LENGTH_SHORT).show(); 
        */ 
       } 
       ByteArrayOutputStream ostream = new ByteArrayOutputStream(); 
       // save image into gallery 
       bitmapscreen_shot.compress(CompressFormat.JPEG, 100, 
         ostream); 
       FileOutputStream fout = new FileOutputStream(imageFile); 
       fout.write(ostream.toByteArray()); 
       fout.close(); 
       Log.e("image_screen_shot", "" + imageFile); 
      } catch (Throwable e) { 
       // Several error may come out with file handling or OOM 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      objUsefullData.dismissProgress(); 

     } 
    }; 
    asyc.execute(); 
} 

希望这将帮助你

+0

这就是说我在这些行上“必须从UI线程调用getRootView方法,当前推断的线程是worker”: View v1 = getWindow()。getDecorView()。getRootView(); v1.setDrawingCacheEnabled(true); 位图bitmapscreen_shot = Bitmap.createBitmap(v1 .getDrawingCache()); v1.setDrawingCacheEnabled(false); – user3586417

+0

是的,但在我的结束它的工作正常,我越来越完美的质量好屏幕截图 – sukhbir

0

我面临这个问题。 v1.setDrawingCacheEnabled(true);之后我补充说,

v1.buildDrawingCache();

并放了一些延迟来调用takeScreenshot();方法。

它是固定的。