Android 拍照 截圖 事件監聽實現
阿新 • • 發佈:2019-01-10
需求是獲得使用者截圖,或者拍照的主動存圖行為。
但是 android 官方沒有提供回撥廣播之類的實現監聽,所以需要用另一種方式達到需求,這裡實現的就是通過監聽media資料夾實現目的。
所需許可權:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
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; // } Log.e("take pic", fileName + "----" + path); } } catch (Exception e) { e.printStackTrace(); 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); }
三星 華為測試通過:public class MainActivity extends AppCompatActivity { private ScreenShotContentObserver screenShotContentObserver; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); screenShotContentObserver = new ScreenShotContentObserver(handler, this) { @Override protected void onScreenShot(String path, String fileName) { } }; } @Override public void onResume() { super.onResume(); getContentResolver().registerContentObserver( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, screenShotContentObserver ); } @Override public void onDestroy() { super.onDestroy(); try { getContentResolver().unregisterContentObserver(screenShotContentObserver); } catch (Exception e) { e.printStackTrace(); } } }
Screenshot_2018-02-19-07-09-48.jpeg----/storage/emulated/0/Pictures/Screenshots/Screenshot_2018-02-19-07-09-48.jpeg
IMG_20180219_071018.jpg----/storage/emulated/0/DCIM/Camera/IMG_20180219_071018.jpg
原始碼下載: