programing

Android에서 화면 캡처를 방지하는 방법

cafebook 2023. 11. 4. 13:18
반응형

Android에서 화면 캡처를 방지하는 방법

안드로이드 어플리케이션에서 화면 녹화를 방지할 수 있습니까?

안드로이드 시큐어 애플리케이션을 개발하고 싶습니다.그것은 내가 백그라운드에서 실행중인 화면 녹화 소프트웨어를 감지하고 그들을 죽일 필요가 있다는 것입니다.스크린샷 방지를 위해 SECURED FLAG를 사용했습니다.하지만 안드로이드 화면의 비디오 캡처도 막을 수 있을지 모르겠습니다.화면 캡쳐(비디오/스크린샷) 방지법 알려주세요

지원되는 수단을 통해 안드로이드 앱의 화면/동영상 캡처를 완벽하게 방지하는 은 불가능하다고 말씀드리겠습니다.하지만 정상적인 안드로이드 기기에 대해서만 차단하고자 한다면, SECURED FLAG는 매우 중요합니다.

1)보안 플래그는 일반 스크린샷과 비디오 캡처를 모두 차단합니다.

이 링크의 문서에는 다음과 같이 나와 있습니다.

창 플래그: 창 내용이 스크린샷에 표시되거나 보안되지 않은 디스플레이에 표시되지 않도록 창 내용을 안전한 것으로 간주합니다.

위 솔루션을 사용하면 애플리케이션이 앱의 비디오를 캡처하는 것을 확실히 방지할 수 있습니다.

여기 정답을 보세요.

2)화면 내용을 캡처하는 다른 방법이 있습니다.

다른 앱의 화면을 rooted 디바이스에 캡처하거나 SDK를 이용하여 캡처할 수도 있고,

차단하거나 통지를 받을 가능성은 거의 없습니다

예를 들어, SDK를 통해 전화 화면을 컴퓨터에 미러링하는 소프트웨어가 있으므로 화면 캡처 소프트웨어를 사용할 수 있으며 앱에서 복구할 수 없습니다.

여기 정답을 보세요.

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

다음 줄만 추가하면 됩니다.

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

당신앞에setContentView()방법.

한 가지 활동에만 적합한 모든 답변을 보았지만, 활동에 코드를 추가하지 않고 모든 활동에 대한 스크린샷을 차단하는 제 솔루션이 있습니다.먼저 Custom Application 클래스를 만들고 추가합니다.registerActivityLifecycleCallbacks그럼 매니페스트에 등록하세요.

My ApplicationContext.class

public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}

매니페스트

 <application
        android:name=".MyApplicationContext"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

화면 캡처를 비활성화하려면:

다음 줄의 코드 추가onCreate()방법:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                           WindowManager.LayoutParams.FLAG_SECURE);

화면 캡처를 활성화하려면:

찾기LayoutParams.FLAG_SECURE코드 라인을 제거합니다.

Java 사용자의 경우 사용자 위에 이 줄을 씁니다.setContentView(R.layout.activity_main);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);

코틀린 사용자용

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

앱을 디바이스/프로파일 소유자로 만들고 전화를 걸 수 있습니다.setScreenCaptureDisabled(). 문서에서 이 api는 다음을 수행합니다.

public void setScreenCapture사용 안 함(ComponentName admin, boolean disabled) API 레벨 21에 추가됨

장치/프로파일 소유자가 화면 캡처 비활성화 여부를 설정하기 위해 호출합니다.화면 캡처를 비활성화하면 안전한 비디오 출력이 없는 디스플레이 장치에 콘텐츠가 표시되지 않게 됩니다.보안 표면 및 보안 디스플레이에 대한 자세한 내용은 FLAG_SECURE를 참조하십시오.

호출 장치 관리자는 장치 또는 프로필 소유자여야 합니다.그렇지 않은 경우에는 보안 예외가 적용됩니다.매개 변수 adminWhich DeviceAdminRecever 이 요청이 연결되어 있습니다. 화면 캡처가 비활성화되었는지 여부를 비활성화합니다.

또는 MDM(Mobile Device Management) 파트너 앱이 될 수도 있습니다.OEM은 MDM 파트너 앱에 추가 API를 제공하여 장치를 제어합니다.예를 들어 samsung은 MDM 파트너에게 장치의 화면 녹화를 제어하는 api를 제공합니다.

현재 화면 캡처 제한을 적용할 수 있는 유일한 방법입니다.

시도해 보기:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

이 솔루션을 사용하여 앱에서 수동 스냅샷을 허용하는 동시에 앱이 백그라운드로 돌아갈 때 화면 캡처를 허용하지 않습니다. 도움이 되었으면 좋겠습니다.

@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}

공식 가이드에 따르면 다음을 추가할 수 있습니다.WindowManager.LayoutParams.FLAG_SECURE창 레이아웃에 따라 스크린샷이 허용되지 않습니다.

기본 활동에 대한 OnCreate 이벤트(Xamarin) 내부에 이 줄 추가

Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);
public class InShotApp extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            registerActivityLifecycle();
        }
    
        private void registerActivityLifecycle() {
    
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                    activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
    
                @Override
                public void onActivityStarted(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityResumed(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityPaused(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityStopped(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
    
                }
    
                @Override
                public void onActivityDestroyed(@NonNull Activity activity) {
    
                }
            });
    
        }
    }

응용프로그램에서 스크린샷을 찍을 가능성을 차단하는 것과 관련하여:

Window window = requireActivity().getWindow();
window.addFlag(WindowManager.LayoutParams.FLAG_SECURE);

이 플래그(예: onDestroy)를 청소하는 것을 기억하십시오. 앱의 다른 안전한 장소에서 스크린샷을 활성화하려면:

window.clearFlags(WWindowManager.LayoutParams.FLAG_SECURE);

사진 스크린샷에 대해 FLAG_SECure가 루트 장치에서 작동하지 않습니다.

하지만 스크린샷 파일을 모니터하면 원본 파일이 나오는 것을 막을 수 있습니다.

이거 먹어봐요.

1. Android 원격 서비스로 스크린샷(파일 모니터) 모니터링
2. 원본 스크린샷 이미지를 삭제합니다.
3. 수정할 수 있도록 비트맵 인스턴스를 전달합니다.

Kotlin 사용자는 Application 클래스에 다음 코드를 추가하여 앱 스크린샷을 방지할 수 있습니다.

class MyApplication : Application() {

override fun onCreate() {
  
    super.onCreate()
   
    registerActivityLifecycle()
   
}

private fun registerActivityLifecycle() {
    registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            activity.window.setFlags(
                WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE
            )
        }

        override fun onActivityStarted(activity: Activity) {}
        override fun onActivityResumed(activity: Activity) {}
        override fun onActivityPaused(activity: Activity) {}
        override fun onActivityStopped(activity: Activity) {}
        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        override fun onActivityDestroyed(activity: Activity) {}
    })
}

}

스크린샷을 비활성화해야 하고 Jetpack을 사용 중인 사용자에게 필요한 구성은 다음과 같습니다.

fun Activity.disableScreenshots() {
  window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
}

fun Activity.enableScreenshots() {
  window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}

@Composable
fun DisableScreenshots() {
  val context = LocalContext.current
  DisposableEffect(Unit) {
    context.getActivity()?.disableScreenshots()
    onDispose {
      context.getActivity()?.enableScreenshots()
    }
  }
}

그런 다음 합성 가능한 함수에서 DisableScreenshots를 호출합니다;)

쉽고 우아함:

import android.view.WindowManager.LayoutParams;

// ...

@Override
public void onWindowFocusChanged(boolean isFocused) {
  if (isFocused) {
    getWindow().clearFlags(LayoutParams.FLAG_SECURE);
  } else {
    getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
  }
  super.onWindowFocusChanged(isFocused);
}

언급URL : https://stackoverflow.com/questions/28606689/how-to-prevent-screen-capture-in-android

반응형