android開發(fā)之?dāng)r截用戶截屏,并刪除截屏文件

特殊的需求造就特殊的功能

有的付費頁面是不能讓用戶截屏分享的,所以...我們就流氓的攔截掉并且刪除

實現(xiàn)方式

  • 1,注冊一個媒體庫內(nèi)容變化的ContentObserver
  • 2,獲取到媒體文件,查看創(chuàng)建時間和現(xiàn)在時間的差值
  • 3,刪除文件并且通知媒體庫

代碼如下

/**
 * Created by wangfei on 2016/8/1 19:02.
 * 攔截用戶截屏,并且刪除截屏文件
 */
public class ScreenshotContentObserver {

    private Context mContext;
    private HandlerThread handlerThread;
    private Handler handler;
    private static ScreenshotContentObserver instance;
    private static final String TAG = "WWW";
    private static final String EXTERNAL_CONTENT_URI_MATCHER =
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString();
    private static final String[] PROJECTION = new String[]{
            MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATA,
            MediaStore.Images.Media.DATE_ADDED
    };
    private static final String SORT_ORDER = MediaStore.Images.Media.DATE_ADDED + " DESC";
    private ContentResolver mContentResolver;
    private ContentObserver mContentObserver;

    private ScreenshotContentObserver(Context context) {
        mContext = context;
        handlerThread = new HandlerThread("content_observer");
        handlerThread.start();
        handler = new Handler(handlerThread.getLooper()) {

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //刪除截屏
                ((File)msg.obj).delete();
                // 最后通知圖庫更新
                mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile((File)msg.obj)));
            }
        };
    }

    public static void startObserve(Context context) {
        if (instance == null) {
            instance = new ScreenshotContentObserver(context);
        }
        instance.register();
    }

    public static void stopObserve() {
        instance.unregister();
    }

    private void register() {
        mContentResolver = mContext.getContentResolver();
        mContentObserver = new ContentObserver(handler) {
            @Override
            public void onChange(boolean selfChange, Uri uri) {
                Log.d(TAG, "onChange: " + selfChange + ", " + uri.toString());
                if (uri.toString().matches(EXTERNAL_CONTENT_URI_MATCHER)) {
                    Cursor cursor = null;
                    try {
                        cursor = mContentResolver.query(uri, PROJECTION, null, null, SORT_ORDER);
                        if (cursor != null && cursor.moveToFirst()) {
                            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                            long dateAdded = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED));
                            long currentTime = System.currentTimeMillis();
                            Log.d(TAG, "path: " + path + ", dateAdded: " + dateAdded + ", currentTime: " + currentTime);
                            Log.d(TAG, "matchPath(path): " + matchPath(path) + ", matchAddTime(dateAdded): " +
                                    matchAddTime(dateAdded) + ", matchSize(path): " + matchSize(path));
                            if (matchPath(path) && matchAddTime(dateAdded)) {
                                // screenshot added!
                                File file = new File(path);
                                Message message=Message.obtain();
                                message.obj=file;
                                //解決華為手機無法刪除截屏問題
                                handler.sendMessageDelayed(message,250);
                            }
                        }
                    } catch (Exception e) {
                        Log.d(TAG, "Exception" + e.toString());
                    } finally {
                        if (cursor != null) {
                            cursor.close();
                        }
                    }
                }
                super.onChange(selfChange, uri);
            }
        };
        mContentResolver.registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true,
                mContentObserver);
    }

    private void unregister() {
        mContext.getContentResolver().unregisterContentObserver(mContentObserver);
    }


    /**
     * 添加時間與當(dāng)前時間不超過1.5s,大部分時候不超過1s瘟斜。
     *
     * @param addTime 圖片添加時間,單位:秒
     */
    private boolean matchAddTime(long addTime) {
        return System.currentTimeMillis() - addTime * 1000 < 1500;
    }

    /**
     * 尺寸不大于屏幕尺寸
     */
    private boolean matchSize(String filePath) {
        int w = ScreenUtil.getScreenWidth(mContext);
        int h = ScreenUtil.getScreenWidth(mContext);

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);

        return w >= options.outWidth && h >= options.outHeight;
    }

    /**
     * 已調(diào)查的手機截屏圖片的路徑中帶有screenshot
     */
    private boolean matchPath(String filePath) {
        String lower = filePath.toLowerCase();
        return lower.contains("screenshot");
    }

}

使用方式(Activity中)


    protected void onStart() {
        super.onStart();
        ScreenshotContentObserver.startObserve(this);
    }



    protected void onStop() {
        super.onStop();
        ScreenshotContentObserver.stopObserve();
    }

最重要的一步

加權(quán)限

android.permission.READ_EXTERNAL_STORAGE

搞定..........

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浊服,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奔垦,更是在濱河造成了極大的恐慌搬味,老刑警劉巖老赤,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枉氮,居然都是意外死亡志衍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門聊替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楼肪,“玉大人,你說我怎么就攤上這事惹悄〈航校” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵泣港,是天一觀的道長暂殖。 經(jīng)常有香客問我,道長当纱,這世上最難降的妖魔是什么呛每? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮坡氯,結(jié)果婚禮上晨横,老公的妹妹穿的比我還像新娘。我一直安慰自己箫柳,他們只是感情好手形,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悯恍,像睡著了一般库糠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坪稽,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音鳞骤,去河邊找鬼窒百。 笑死,一個胖子當(dāng)著我的面吹牛豫尽,可吹牛的內(nèi)容都是我干的篙梢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼美旧,長吁一口氣:“原來是場噩夢啊……” “哼渤滞!你這毒婦竟也來了贬墩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤妄呕,失蹤者是張志新(化名)和其女友劉穎陶舞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绪励,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡肿孵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疏魏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片停做。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖大莫,靈堂內(nèi)的尸體忽然破棺而出蛉腌,到底是詐尸還是另有隱情,我是刑警寧澤只厘,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布烙丛,位于F島的核電站,受9級特大地震影響懈凹,放射性物質(zhì)發(fā)生泄漏蜀变。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一介评、第九天 我趴在偏房一處隱蔽的房頂上張望库北。 院中可真熱鬧,春花似錦们陆、人聲如沸寒瓦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杂腰。三九已至,卻和暖如春椅文,著一層夾襖步出監(jiān)牢的瞬間喂很,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工皆刺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留少辣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓羡蛾,卻偏偏與公主長得像漓帅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • 面試題總結(jié) 通用 安卓學(xué)習(xí)途徑, 尋找資料學(xué)習(xí)的博客網(wǎng)站 AndroidStudio使用, 插件使用 安卓和蘋果的...
    JingBeibei閱讀 1,674評論 2 21
  • 靜夜思 被自由拉扯 生活是搖搖欲墜的櫥窗 櫥窗卻擺滿瓶罐 一不小心掉下的都是做好的夢 載夢的車馬早已備好 馬兒因為...
    逐月馬尾閱讀 260評論 0 4
  • 這節(jié)課主要是在上節(jié)課的基礎(chǔ)上忙干,對項目的一個進一步的修改和完善器予,打開上次的項目后,進行如下操作: 利用線程對象實現(xiàn)一...
    dxuanr閱讀 177評論 0 0
  • 2017年9月1日晴 今天下班捐迫,我再次繞路而歸乾翔,為的是多看看這烏市黃昏的色彩。在這來過幾次的無人馬路上弓乙,我看到了一...
    文羽墨閱讀 509評論 0 2