【问题标题】:Prevent Screen Capture in Android One Devices防止 Android One 设备中的屏幕捕获
【发布时间】:2021-10-07 06:22:13
【问题描述】:

我想防止在安卓手机中截屏。我加了一行

requireActivity().window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)

这在普通设备上运行良好。但是,当我在 android one 设备上尝试时(https://www.android.com/intl/en_in/one/),它仍然在捕获屏幕截图。

我在 android one 设备上尝试了其他应用程序,如 AmazonPrime、Hotstar 和 GooglePay……虽然他们正在捕获屏幕截图,但内容完全是黑色的。如何在 android one 设备中实现或防止屏幕截图。

【问题讨论】:

    标签: java android kotlin screenshot


    【解决方案1】:

    我们可以收听FileObserver 来检测屏幕截图的时间。然后从存储中删除截取的截图文件。

    这是MediaListenerService的示例代码

    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Environment;
    import android.os.FileObserver;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Looper;
    import android.util.Log;
    import android.widget.Toast;
    
    import androidx.documentfile.provider.DocumentFile;
    
    import java.io.File;
    
    public class MediaListenerService extends Service {
    
        public static FileObserver observer;
        private Context context;
    
        public MediaListenerService() {
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            context = this;
            startWatching();
        }
    
        private void startWatching() {
            //The desired path to watch or monitor
            String pathToWatch = Environment.getExternalStorageDirectory()
                    + File.separator + Environment.DIRECTORY_PICTURES
                    + File.separator + "Screenshots" + File.separator;
            Toast.makeText(this, "Service is Started and trying to watch " + pathToWatch, Toast.LENGTH_LONG).show();
    
            observer = new FileObserver(pathToWatch, FileObserver.ALL_EVENTS) { // set up a file observer to watch this directory
                @Override
                public void onEvent(int event, final String file) {
                    if (event == FileObserver.CREATE || event == FileObserver.CLOSE_WRITE || event == FileObserver.MODIFY || event == FileObserver.MOVED_TO && !file.equals(".probe")) { // check that it's not equal to .probe because thats created every time camera is launched
                        String filePath = pathToWatch + file;
                        Log.d("MediaListenerService", "File created [" + filePath + "]");
                        new Handler(Looper.getMainLooper()).postDelayed(() -> {
    //                        Toast.makeText(getBaseContext(), file + " was saved!", Toast.LENGTH_LONG).show();
                            File screenShotFile = new File(pathToWatch, file);
                            if (screenShotFile.exists()) {
                                try {
                                    boolean isDeleted = screenShotFile.delete();
                                    if (isDeleted) {
                                        Toast.makeText(getBaseContext(), file + " was deleted!", Toast.LENGTH_LONG).show();
                                        Log.d("MediaListenerService", "File deleted [" + filePath + "]");
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }, 200L);
                    }
                }
            };
            observer.startWatching();
        }
    }
    

    Manifest中添加文件权限

    <uses-permission
            android:name="android.permission.WRITE_EXTERNAL_STORAGE"
            tools:ignore="ScopedStorage" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:requestLegacyExternalStorage="true"
    

    Manifest 应用标签下注册您的服务:

    <service
      android:name=".MediaListenerService"
      android:enabled="true"
      android:exported="false" />
    

    并在onCreate下的MainActivity中检查文件存储权限并启动服务

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                startService(Intent(baseContext, MediaListenerService::class.java))
            } else {
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    123
                )
            }
        }
    }
    

    【讨论】:

    • 我同意这适用于删除文件......但我想事先防止它而不是稍后存储和删除......另外,这也需要我获得存储权限......我认为是仅仅为了防止屏幕截图不是一个更好的主意。另外,如果我没有正确停止服务,用户的应用截图也有可能被删除......
    • 是的,我们需要在应用关闭/暂停后停止服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2012-05-11
    • 2015-11-21
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多