2016-07-31 53 views
2

我試圖通過使用MediaProjection API和ImageReader捕獲模擬器屏幕。 但它總是會產生黑屏。代碼如下: 代碼如下。通過使用MediaProjection API爲模擬器捕獲生成黑屏

@Override 
public void onImageAvailable(ImageReader reader) { 

    Log.i(TAG, "in OnImageAvailable"); 

    FileOutputStream fos = null; 
    Bitmap bitmap = null; 
    Image img = null; 

    try { 

     img = reader.acquireLatestImage(); 

     if (img != null) { 

      Image.Plane[] planes = img.getPlanes(); 

      if (planes[0].getBuffer() == null) { 
       return; 
      } 

      int width = img.getWidth(); 
      int height = img.getHeight(); 
      int pixelStride = planes[0].getPixelStride(); 
      int rowStride = planes[0].getRowStride(); 
      int rowPadding = rowStride - pixelStride * width; 

      Log.v(TAG, "width: "+width+", height: "+height+", pixelStride: "+pixelStride+", rowStride: "+rowStride+", rowPadding: "+rowPadding); 

      int offset = 0; 
      bitmap = Bitmap.createBitmap(metrics, width, height, Bitmap.Config.ARGB_8888); 
      ByteBuffer buffer = planes[0].getBuffer(); 

      for (int i = 0; i < height; ++i) { 
       for (int j = 0; j < width; ++j) { 
        int pixel = 0; 
        pixel |= (buffer.get(offset) & 0xff) << 16;  // R 
        pixel |= (buffer.get(offset + 1) & 0xff) << 8; // G 
        pixel |= (buffer.get(offset + 2) & 0xff);  // B 
        pixel |= (buffer.get(offset + 3) & 0xff) << 24; // A 
        bitmap.setPixel(j, i, pixel); 
        offset += pixelStride; 
       } 
       offset += rowPadding; 
      } 

      String name = "/pyscreen" + count + ".png"; 
      count++; 
      File file = new File(Environment.getExternalStorageDirectory(), name); 
      fos = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
      Log.i(TAG, "image saved in" + Environment.getExternalStorageDirectory() + name); 
      img.close(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (null != fos) { 
      try { 
       fos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (null != bitmap) { 
      bitmap.recycle(); 
     } 
     if (null != img) { 
      img.close(); 
     } 
    } 
} 

我已經提到Take a screenshot using MediaProjectionAndroid ImageReader.acquireLatestImage returns invalid JPG \ 讀者acquirelatestimage - 回報 - 無效-JPG 他們工作得很好REAL設備,但不適用於仿真器。

如何使用模擬器截屏? 我的實現有一些問題? 你有什麼想法嗎?

感謝您的幫助!

+0

嗨Taichiro,我有同樣的問題,但我一直沒有能夠得到任何棒棒糖模擬器工作。你是否已經通過GUI在Android Studio中創建了AVD,並試圖使它工作?如果是這樣,你使用了哪些特定設置?我能夠使它與棉花糖AVD一起工作。我也很想知道根本原因,如果可能的話,嘗試修補其他一些仿真器。 –

+0

大衛你好! 嘗試將圖形設置設置爲「Software - GLES 2.0」。 它應該工作。 當然,這個選項模擬器會很重。 然後你應該像WVGA一樣降低分辨率。 –

+0

嗨Taichiro - 我給了一個鏡頭,它似乎沒有幫助..你最近證實了這一點?你碰巧有任何代碼或應用程序,你可以指出,這是確認與SW在棒棒糖工作? –

回答

0

在這裏,我可以自己解決它。 我選擇了Nexus 5X作爲測試模擬器,但它可能包含一些錯誤。 (或規格?) 我通過命令行創建了一個仿真器,如下所示。

[Terminal 0] 
android update sdk -a -u -t sys-img-x86-android-23 
android create avd -t 1 -b x86 -n "Emulator23_x86" 
emulator -avd Emulator23_x86 

[Terminal 1] 
adb install -g path_to_apk/app-debug.apk 
add pull /storage/sdcard/some.png . 

它完全正常工作。 因此,可能是由Android Studio的設備管理器創建的模擬器也可以正常工作。 然後你應該選擇Nexus *之外的其他仿真器,比如WVGA。

任何方式感謝您的傢伙的幫助!