Listen to the action of the screenshot in android

I am new to Android development.

I am making an application that will respond when a screenshot of an Android phone is dropped. I heard that android allows such actions to detect broadcast receivers , so I looked at the Android developer documentation here .

I think that the framework developers forgot or did not implement the broadcast screenshot code, because they did not indicate this action in their documentation.

Is there any other way to listen to screenshots?

+6
source share
1 answer

You can detect a captured ScreenShot event using ContentObserver . I use this in one of my projects.

ScreenShotContentObserver.java

 public abstract class ScreenShotContentObserver extends ContentObserver { private Context context; private boolean isFromEdit = false; private String previousPath; public ScreenShotContentObserver(Handler handler, Context context) { super(handler); this.context = context; } @Override public boolean deliverSelfNotifications() { return super.deliverSelfNotifications(); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); } @Override public void onChange(boolean selfChange, Uri uri) { Cursor cursor = null; try { cursor = context.getContentResolver().query(uri, new String[]{ MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATA }, null, null, null); if (cursor != null && cursor.moveToLast()) { int displayNameColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME); int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); String fileName = cursor.getString(displayNameColumnIndex); String path = cursor.getString(dataColumnIndex); if (new File(path).lastModified() >= System.currentTimeMillis() - 10000) { if (isScreenshot(path) && !isFromEdit && !(previousPath != null && previousPath.equals(path))) { onScreenShot(path, fileName); } previousPath = path; isFromEdit = false; } else { cursor.close(); return; } } } catch (Throwable t) { isFromEdit = true; } finally { if (cursor != null) { cursor.close(); } } super.onChange(selfChange, uri); } private boolean isScreenshot(String path) { return path != null && path.toLowerCase().contains("screenshot"); } protected abstract void onScreenShot(String path, String fileName); } 

And use this class in your activity: -

 public class MainActivity extends AppCompatActivity { private ScreenShotContentObserver screenShotContentObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); HandlerThread handlerThread = new HandlerThread("content_observer"); handlerThread.start(); final Handler handler = new Handler(handlerThread.getLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; screenShotContentObserver = new ScreenShotContentObserver(handler, this) { @Override protected void onScreenShot(String path, String fileName) { File file = new File(path); //this is the file of screenshot image } }; } @Override public void onResume() { super.onResume(); getContentResolver().registerContentObserver( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, screenShotContentObserver ); } @Override public void onPause() { super.onPause(); try { getContentResolver().unregisterContentObserver(screenShotContentObserver); } catch (Exception e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); try { getContentResolver().unregisterContentObserver(screenShotContentObserver); } catch (Exception e) { e.printStackTrace(); } } } 

Remember to stop Observer in onPause or onDestroy methods in Activity

+2
source

All Articles