2016-04-27 93 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();方法。

它是固定的。