0
点赞
收藏
分享

微信扫一扫

拍照截图备份

深夜瞎琢磨 2022-06-20 阅读 128
package cn.mvp.other;

import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.provider.MediaStore;

/**
* 拍照截图观察者
* 使用:
* 1.
* screenShotContentObserver = new ScreenShotContentObserver(new Handler(), this) {
*
* @Override protected void onScreenShot(String path, String fileName) {
* Log.i("path = [" + path + "], fileName = [" + fileName + "]");
* }
* };
* 2.
* getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, screenShotContentObserver);
* 3.
* getContentResolver().unregisterContentObserver(screenShotContentObserver);
*/
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 {
ContentResolver contentResolver = context.getContentResolver();
cursor = contentResolver.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;
// }
onScreenShot(path, fileName);
// 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);

}

 

package cn.mvp.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.provider.MediaStore;

import java.io.File;
import java.io.FileNotFoundException;

import androidx.annotation.Nullable;
import cn.mvp.global.MyApplication;
import cn.mvp.mlibs.log.Log;
import cn.mvp.mlibs.utils.FileUtils;
import cn.mvp.mlibs.utils.SDCardUtils;
import cn.mvp.other.ScreenShotContentObserver;

/**
* 拍照截图监听服务
*/
public class PhotoCaptureService extends Service {

private ScreenShotContentObserver screenShotContentObserver;
/**
* 启用备份
*/
private boolean isEnableBackUp;

public static void startService(Context context, boolean isEnableBackUp) {
Intent intent = new Intent(context.getApplicationContext(), PhotoCaptureService.class);
try {
intent.putExtra("arg_isEnableBackUp", isEnableBackUp);
context.getApplicationContext().startService(intent);
} catch (Exception e) {
e.printStackTrace();
}
}

public static void stopService(Context context) {
Intent intent = new Intent(context.getApplicationContext(), PhotoCaptureService.class);
try {
context.getApplicationContext().stopService(intent);
} catch (Exception e) {
e.printStackTrace();
}
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
screenShotContentObserver = new ScreenShotContentObserver(new Handler(), this) {
@Override
protected void onScreenShot(String path, String fileName) {
if (isEnableBackUp) {
try {
String destFilePath = getAvailableDirPath() + FileUtils.getFileName(path);
//在图库里隐藏
FileUtils.writeFile(destFilePath + ".nomedia", "");
//复制截图或拍照
FileUtils.copyFile(path, destFilePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
};
Log.i("开始拍照截图监听服务>注册监听观察者");
getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, screenShotContentObserver);
}

/**
* @return 获取可用的文件夹路径
*/
private String getAvailableDirPath() {
String path;
if (SDCardUtils.isAvailable()) {
SDCardUtils.getExternalFilesDir(MyApplication.getContext());
if (SDCardUtils.getExternalPublicStorageDirectory() != null) {
path = SDCardUtils.getExternalPublicStorageDirectory() + File.separator + "imageBack" + File.separator;
} else {
path = SDCardUtils.getExternalFilesDir(MyApplication.getContext()) + File.separator + "imageBack" + File.separator;
}
} else {
path = SDCardUtils.getInternalFilesDir(MyApplication.getContext()) + File.separator + "imageBack" + File.separator;
}
FileUtils.makeDirs(path);
Log.i("path = " + path);
return path;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
isEnableBackUp = intent.getBooleanExtra("arg_isEnableBackUp", true);
return super.onStartCommand(intent, flags, startId);
}


@Override
public void onDestroy() {
super.onDestroy();
try {
getContentResolver().unregisterContentObserver(screenShotContentObserver);
Log.i("销毁拍照截图监听服务>解除监听观察者");
} catch (Exception e) {
e.printStackTrace();
}
}
}
<service
android:name=".service.PhotoCaptureService"
android:enabled="true"
android:exported="true" />
photoCaptureBackup.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
PhotoCaptureService.startService(MainActivity.this, true);
} else {
PhotoCaptureService.stopService(MainActivity.this);
}
UIUtils.tipToast(MainActivity.this, isChecked ? "开启照片截图备份" : "关闭照片截图备份");
});

 


举报

相关推荐

0 条评论