【问题标题】:Is it possible to intercept taking screenshot event when my app is in the foreground当我的应用程序在前台时,是否可以拦截截屏事件
【发布时间】:2014-05-21 13:49:58
【问题描述】:

当我的应用程序在前台时,是否可以拦截截屏事件(或为其创建监听器)?我想在音量下+电源键截屏时执行一些自己的代码。

【问题讨论】:

    标签: android screenshot


    【解决方案1】:

    不,抱歉,您无法控制屏幕截图。如果您的目标是阻止您的应用截取屏幕截图(例如,出于安全原因),请使用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);
      }
    }
    

    【讨论】:

    • Oki,我希望得到截取的屏幕截图并在我的应用程序中使用它..
    • @Luizje:我不相信截图的存储位置是有保证的。这不是 Android SDK 的一部分。
    • Thnx,我想我可以通过添加 FileObserver 来监听 CREATE 事件,然后在触发事件时检索屏幕截图..
    • @Luizje: FileObserver 需要一个特定的目录。我不相信屏幕截图的存储位置有保证。这不是 Android SDK 的一部分。
    • 这不会有问题,因为我的应用只会在一种类型的设备上使用。
    【解决方案2】:

    执行此任务的方法是在屏幕截图目录中添加一个文件观察器。在下面编写示例代码以观察文件路径 截图文件观察者 包 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);
        }
    }
    

    【讨论】:

    • 截图目录不是 Android 的公共 API 的一部分,这意味着它可能因设备而异。如果您选择这样的解决方案,您唯一可行的选择是创建从设备到屏幕截图目录的映射。总而言之,我不建议走那条路。
    • 能否请您发布一个带有描述的示例。
    猜你喜欢
    • 2013-09-10
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2020-02-05
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多