Android'de Ekran Yakalama nasıl engellenir


118

Android Uygulamasında ekran kaydının engellenmesi mümkün müdür?

Bir Android Secure Uygulaması geliştirmek istiyorum. Bunun için arka planda çalışan ekran kayıt yazılımını tespit etmem ve onları öldürmem gerekiyor. Ekran görüntülerini önlemek için GÜVENLİ BAYRAĞı kullandım. Ama Android Ekranının Video yakalamasını da engellemenin mümkün olduğunu bilmiyorum. Ekran yakalamanın (video / ekran görüntüleri) nasıl engelleneceğini bana bildirin.


8
- İçeriği çalmak için her zaman bir kameranın ekrana doğrultulabileceğini unutmamalısınız - DRM alanında kullanılan bazı teknikler var ama oldukça karmaşıklar ve kaputun altında neler olduğunu gerçekten bilmiyorum
Shai Levy

9
@ShaiLevy'nin açıkladığı kavrama genellikle , medya aktarımının kaçınılmaz güvenlik açıklığını açıklayan Analog Delik en.wikipedia.org/wiki/Analog_hole denir .
gusridd

Yanıtlar:


126

Desteklenen yollarla herhangi bir android uygulamasının ekran / video yakalamasını tamamen engellemenin mümkün olmadığını söyleyeceğim . Ancak, yalnızca normal android cihazlar için engellemek istiyorsanız , GÜVENLİ İŞARET önemlidir.

1) Güvenli bayrak hem normal ekran görüntüsünü hem de video yakalamayı engeller.

Ayrıca bu bağlantıdaki belgeler şunu söylüyor:

Pencere bayrağı: Pencerenin içeriğini güvenli olarak değerlendirin, ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller.

Yukarıdaki çözüm, uygulamaların uygulamanızın videosunu yakalamasını kesinlikle önleyecektir

Cevabı burada görün .

2) Ekran içeriğini yakalamanın alternatif yolları vardır.

Başka bir uygulamanın ekranını köklü bir cihazda veya SDK kullanarak yakalamak mümkün olabilir,

Her ikinizin de ya engelleme ya da bildirim alma şansınız yok denecek kadar azdır.

Örneğin: Telefon ekranınızı SDK aracılığıyla bilgisayarınıza yansıtmak için bir yazılım vardır ve bu nedenle ekran yakalama yazılımı, uygulamanız tarafından keşfedilemeyen burada kullanılabilir.

Cevabı burada görün .

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

11
ya da el kamerasıyla görüntüyü tıklayabilirsiniz.
Ravinder Payal

68

Sadece şu satırı ekleyin:

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

setContentView()Yönteminizden önce .


11
Soru: [alıntı] GÜVENLİ BAYRAĞı kullandım [alıntı yap] "cevabın": [alıntı] FLAG_SECURE'ü kullanabilirsin [unqote] Burada bir sorun bulabilir misin?
46'ya bakın.

Merhaba, web tabanlı bir portal uygulaması geliştiriyorum. Kullanıcılar bu portala ulaşmak için her türlü tarayıcıyı kullanabilir. Bu portalın kullanıcıları, mobil cihaz kullanırken ekran görüntülerini almamalıdır. Web uygulaması için aynı önlemleri (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) kullanabilir miyim. IOS için çalışıyor mu? Aynı tür önlemleri alabilirsem bu hattı nereden aramalıyım?
Ferda-Özdemir-Sönmez

24

Ekran Yakalamayı devre dışı bırakmak için:

onCreate()Yöntemde aşağıdaki kod satırını ekleyin :

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

Ekran Yakalamayı etkinleştirmek için:

LayoutParams.FLAG_SECUREKod satırını bulun ve kaldırın.


12

Java kullanıcıları için bu satırı setContentView(R.layout.activity_main);

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

Kotlin kullanıcıları için

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

kotlin için, bağlama bağlı olarak, bunun window?.set...nedeni Diyaloglarda bir Pencerenizin olup olmayacağını bilmiyor olmanızdır.
Martin Marconcini

1
Asıl soru zaten güvenli bayrak kullandıklarını söyledi ve cevabınız güvenli bayrak kullanmaktır. Bu, gönderilen soruya gerçekten cevap vermiyor.
Subaru Tashiro

10

Görünüşe göre uygulamanızdaki ekran görüntülerini nasıl devre dışı bırakacağınızı biliyorsunuz ve bu konuda size yardımcı olacak başka yanıtlar da var. Ama size kimsenin vermediği bazı önemli bilgiler vermeye çalışacağım .

1) Ekran görüntüsü (fotoğraf / video) almaktan% 100 güvenli bir uygulamaya sahip olamazsınız . Orada hiçbir resmi yolu Android'de ekran görüntüleri almak için. Bir uygulama ekran kaydediyorsa, bazı desteklenmeyen yöntemler (köklendirme veya SDK kullanarak) kullanıyor olmalıdır.

Kayıt ekranlarına kök erişimi kullanıyorsa, bir uygulamayı engellemeniz için çok az kapsam vardır.

2) Burada kimse bu konudan bahsetmedi, ancak kullanırken çok dikkatli olun WindowManager.LayoutParams.FLAG_SECURE. Birçok cihazda (Samsung Galaxy ACE, örneğin GT-S5830 gibi) tüm görüntüyü karıştırdığı doğrulanmıştır. Bunun gibi,

görüntü açıklamasını buraya girin

Lütfen böyle bir çek koyun,

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

ICS cihazlarında mükemmel çalışıyor, bu yüzden orada sorun yok.

3) Ayrıca Android 4.3 gibi daha yeni cihazlarda bile bunun ekran döndürüldüğünde animasyon sorunlarına neden olduğunu öğrendim. Lütfen bu hata raporunu kontrol edin .


28
oy almak için diğer insanların cevaplarını kopyalayıp yapıştırmamalısınız. Ayrıca cevabınızı kopyaladığınız yere bir referans ekleyin. stackoverflow.com/a/11121897/5437621
mrid

cevabınız kopyalayıp yapıştırmaktır, lütfen birinin cevabını kopyalayıp yapıştırmayın. bu yanıtı aşağıda belirtilen bağlantıdan kopyaladınız. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi

9

Uygulamanızı cihaz / profil sahibi yapabilir ve arayabilirsiniz setScreenCaptureDisabled(). Gönderen docs , bu API şunları yapar:

public void setScreenCaptureDisabled (ComponentName admin, boole devre dışı) API seviyesi 21'de eklendi

Ekran yakalamanın devre dışı bırakılıp bırakılmayacağını belirlemek için bir cihaz / profil sahibi tarafından aranır. Ekran yakalamayı devre dışı bırakmak, içeriğin güvenli bir video çıkışı olmayan görüntüleme cihazlarında gösterilmesini de engeller. Güvenli yüzeyler ve güvenli ekranlar hakkında daha fazla ayrıntı için FLAG_SECURE sayfasına bakın.

Çağıran cihaz yöneticisi bir cihaz veya profil sahibi olmalıdır. Değilse, bir güvenlik istisnası atılır. Parametreler admin Bu isteğin hangi DeviceAdminReceiver ile ilişkili olduğu. devre dışı Ekran yakalamanın devre dışı bırakılıp bırakılmayacağı.

Alternatif olarak bir MDM (Mobil Cihaz Yönetimi) olabilirsiniz iş ortağı uygulaması olabilirsiniz.OEM'ler, cihazı kontrol etmek için MDM ortak uygulamalarına ek API'ler sağlar.Örneğin samsung, MDM ortaklarına cihazdaki ekran kaydını kontrol etmek için api sağlar.

Şu anda ekran yakalama kısıtlamalarını uygulayabilmenin tek yolu budur.


9

Bunu dene:

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

3
Soru: [alıntı] GÜVENLİ BAYRAĞı kullandım [alıntı yap] "cevabın": [alıntı] FLAG_SECURE'ü kullanabilirsin [unqote] Burada bir sorun bulabilir misin?
46'ya bakın.

Pencere bayrağı: Pencerenin içeriğini güvenli olarak değerlendirin, ekran görüntülerinde görünmesini veya güvenli olmayan ekranlarda görüntülenmesini engeller. Güvenli yüzeyler ve güvenli ekranlar hakkında daha fazla ayrıntı için FLAG_SECURE sayfasına bakın. Sabit Değer: 8192 (0x00002000) Buradan daha fazlasını okuyun developer.android.com/reference/android/view/…
Jithu PS

Lütfen iyileştirmelerimizi geri alarak yayınınızı tahrif etmeyin
FelixSFD

8

Sadece tek bir aktivite için uygun olan tüm cevapları gördüm ancak aktiviteye herhangi bir kod eklemeden tüm aktivitelerin ekran görüntüsünü engelleyecek bir çözümüm var. Öncelikle bir Özel Uygulama sınıfı oluşturun ve bir registerActivityLifecycleCallbacks.Daha sonra bunu bildiriminize kaydedin.

MyApplicationContext.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) {
            }
        });
    }



}

Belirgin

 <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">

her durumda çalışıyor mu?
gopalanrc

Projemi denedim, sonra tüm aktivitelerde çalıştı. @gopalanrc
Gk Mohammad Emon

2

Bu resmi kılavuza göre , WindowManager.LayoutParams.FLAG_SECUREpencere düzeninize ekleyebilir ve ekran görüntülerine izin vermeyecektir.


2

Bu çözümü, uygulama arka planda çalışırken ekran yakalamaya izin vermezken uygulamada manuel anlık görüntüye izin vermek için kullandım, umarım yardımcı olur.

@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();
}

0

fotoğraf ekran görüntüsü hakkında, FLAG_SECURE köklü cihaz çalışmıyor.

ancak ekran görüntüsü dosyasını izlerseniz, orijinal dosyanın alınmasını engelleyebilirsiniz.

Bu deneyin bir tane .

1. android uzaktan servis ile ekran görüntüsünü (dosya izleme) izleme
2. orijinal ekran görüntüsünü silin.
3. Değiştirebilmeniz için bitmap örneğini teslim edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.