【发布时间】:2014-05-21 13:49:58
【问题描述】:
当我的应用程序在前台时,是否可以拦截截屏事件(或为其创建监听器)?我想在音量下+电源键截屏时执行一些自己的代码。
【问题讨论】:
标签: android screenshot
当我的应用程序在前台时,是否可以拦截截屏事件(或为其创建监听器)?我想在音量下+电源键截屏时执行一些自己的代码。
【问题讨论】:
标签: android screenshot
不,抱歉,您无法控制屏幕截图。如果您的目标是阻止您的应用截取屏幕截图(例如,出于安全原因),请使用FLAG_SECURE:
public class FlagSecureTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(LayoutParams.FLAG_SECURE,
LayoutParams.FLAG_SECURE);
setContentView(R.layout.main);
}
}
【讨论】:
FileObserver 需要一个特定的目录。我不相信屏幕截图的存储位置有保证。这不是 Android SDK 的一部分。
执行此任务的方法是在屏幕截图目录中添加一个文件观察器。在下面编写示例代码以观察文件路径 截图文件观察者 包 com.example.main;
import android.os.Environment;
import android.os.FileObserver;
import android.util.Log;
public class ScreenshotObserver extends FileObserver {
private static final String PATH = Environment.getExternalStorageDirectory().toString() + "/Pictures/Screenshots";
private static final String TAG = "ScreenshotObserver";
private ScreenshotListener listener;
private String mLastTakenPath;
ScreenshotObserver(ScreenshotListener listener) {
super(PATH);
this.listener = listener;
Log.d(TAG, PATH);
}
@Override
public void onEvent(int event, String path) {
Log.d(TAG, String.format("Detected new file added %s", path));
if (path==null || event != FileObserver.CLOSE_WRITE)
Log.d(TAG, "Don't care.");
else if (mLastTakenPath!=null && path.equalsIgnoreCase(mLastTakenPath))
Log.d(TAG, "This event has been observed before.");
else {
mLastTakenPath = path;
listener.onScreenshotTaken(path);
Log.d(TAG, "Send event to listener.");
}
}
public void start() {
super.startWatching();
Log.d(TAG, "Start Watching.");
}
public void stop() {
super.stopWatching();
Log.d(TAG, "Stop Watching.");
}
}
实现文件观察器的活动
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity implements ScreenshotListener{
private ScreenshotObserver obs;
@Override
protected void onCreate( Bundle savedInstanceState ) {
super.onCreate(savedInstanceState);
obs = new ScreenshotObserver(this);
obs.start();
setContentView(R.layout.activity_main);
}
@Override
public void onScreenshotTaken( String path ) {
TextView t = (TextView)findViewById(R.id.monText);
t.setText("Screenshot taken ! " + path);
}
}
【讨论】: