2016-07-31 130 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。

任何方式感谢您的家伙的帮助!