I'm using android MediaProjection for taking screenshot. The projection
needs to be stopped after taking screenshot and virtual display should be
released but VirtualDisplay.release() is not releasing the display. Here is
the code to create display.
startActivityForResult(mProjectionManager.createScreenCaptureIntent(),
REQUEST_CODE);
@Overrideprotected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == REQUEST_CODE) {
sMediaProjection = mProjectionManager.getMediaProjection(resultCode,
data);
// display metrics
DisplayMetrics metrics = getResources().getDisplayMetrics();
mDensity = metrics.densityDpi;
mDisplay = getWindowManager().getDefaultDisplay();
Point size = new Point();
mDisplay.getSize(size);
mWidth = size.x;
mHeight = size.y;
// register media projection stop callback
sMediaProjection.registerCallback(new MediaProjectionStopCallback(),
mHandler);
// register orientation change callback
mOrientationChangeCallback = new OrientationChangeCallback(this);
if (mOrientationChangeCallback.canDetectOrientation()) {
mOrientationChangeCallback.enable();
}
// start capture reader
mImageReader = ImageReader.newInstance(mWidth, mHeight,
PixelFormat.RGBA_8888, 1);
mVirtualDisplay = sMediaProjection.createVirtualDisplay(SCREENCAP_NAME,
mWidth, mHeight, mDensity, VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(),
null, mHandler);
mImageReader.setOnImageAvailableListener(new ImageAvailableListener(),
mHandler);
}}
To stop the projection, I call sMediaProjection.stop(); and here is my
MediaProjectionStopCallback implementation.
private class MediaProjectionStopCallback extends MediaProjection.Callback {
@Override
public void onStop() {
Log.e("ScreenCapture", "stopping projection.");
mHandler.post(new Runnable() {
@Override
public void run() {
if (mVirtualDisplay != null) {
mVirtualDisplay.release();
Log.e("Virtual Display", "Released");
}
if (mImageReader != null)
mImageReader.setOnImageAvailableListener(null, null);
if (mOrientationChangeCallback != null)
mOrientationChangeCallback.disable();
sMediaProjection.unregisterCallback(MediaProjectionStopCallback.this);
DisplayManager disp = (DisplayManager)
getSystemService(DISPLAY_SERVICE);
Display[] allDisplays =
disp.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
Log.e(TAG + "-Display", "Display Count " + allDisplays.length);
for (Display dl : allDisplays) {
Log.e(TAG + "-Display", "Display name: " + dl.getName() + "
Display id: " + dl.getDisplayId());
}
}
});
//Toast.makeText(getApplicationContext(), "Projection Stopped",
Toast.LENGTH_SHORT).show();
}}
This is the logcat.
03-02 14:52:55.925 8264-8732/codistan.pk.squeeze_me E/ScreenCapture﹕
stopping projection.03-02 14:52:55.925 8264-8732/codistan.pk.squeeze_me
E/Virtual Display﹕ Released03-02 14:52:55.925
8264-8732/codistan.pk.squeeze_me
E/codistan.pk.squeeze_me.ScreenCaptureActivity-Display﹕ Display Count 103-02
14:52:55.935 8264-8732/codistan.pk.squeeze_me
E/codistan.pk.squeeze_me.ScreenCaptureActivity-Display﹕ Display name: screencap
Display id: 1
I have double checked, the above onStop method is properly called as can be
seen in the logcat. After releasing the display in onStop when I check the
available displays, the virtual display is still listed as an available
display. It affects the phone display and graphics and I can't play any
video and the issue remains even after uninstalling the app untill I
restart the phone. I have checked this link Android virtual display release
does not remove display
<http://stackoverflow.com/questions/35718862/android-virtual-display-release-does-not-remove-display>,
posted this on stackoverflow Android VirtualDisplay.release() not releasing
the display
<http://stackoverflow.com/questions/35755307/android-virtualdisplay-release-not-releasing-the-display>
and
searched a lot but found nothing helpful. Your help is highly appreciated.
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/80effe94-2c9e-4b58-91ad-c6aca86a90e2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.