2016-04-13 17 views
1

, senAndroid 5.0 veya sdk Ekran görüntüsünün nasıl> 21

Process sh = Runtime.getRuntime().exec("su", null,null); 
OutputStream os = sh.getOutputStream(); 
os.write(("/system/bin/screencap -p " + "/sdcard/img.png").getBytes("ASCII")); 
os.flush(); 
os.close(); 
sh.waitFor(); 

Ama SDK> 21 (5.0 veya daha yüksek) ile O değil koduyla bir ekran görüntüsü alabilir Bu işlevi destekleyin. Yani, ekranın Android 5.0 veya üzeri ile nasıl çekileceğini öğrenmek istiyorum (başka bir uygulama).

MediaProjectionManager'ı gördüm, ancak alınan sonuç için onActivityResult'u çalıştırması gerekiyor, ancak hizmette etkin olamaz.

cevap

0

Bu senin için irade için kısa ekranı almak: Bu dünyada sizin sınıfta beyan file-

özel Dosya imageFile; özel geçersiz takeScreenshot() {

try { 
     String mPath = Environment.getExternalStorageDirectory().toString() +"\\/pic";   View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 

     imageFile = new File(mPath); 

     FileOutputStream outputStream = new FileOutputStream(imageFile); 
     int quality = 100; 
     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
+0

Bu ekran ile, root View almak gerekir, diğer uygulama bir çekim ekran almak istiyorum Üzgünüz. Ancak, serivce'dan bir fotoğraf çekmek istiyorum. Başka bir yöntem biliyor musunuz? –

0

İlk sonra yukarıdaki kod ile bu gibi olmayan aktivite sınıf dosyasında statik mActivity kullanmak bu-

public class FirstScreenActivity extends AppCompatActivity { 

public static Activity mActivity; 
private File imageFile; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mActivity=this; 
} 

@Override 
protected void onResume() { 
    super.onResume();} 

sevdiği Etkinlik sınıfında bir etkinlik nesnesi eklemek önceki cevap: İşte

View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView(); 
+0

Biliyorum ama siz sorumu anlamıyorsunuz, başka bir uygulamanın ekranını yakalamak istiyorum. –

+0

Eğer durum buysa, aslında güvenlik riskidir, ancak evet bunu yapabilirsiniz. –

+0

bunun için, işte hilesi ... bir recivever kullanabilirsin ... manifest dosyasında belirt ve sonra belirli olayı kullan (ekranın kilidi açıldığında olduğu gibi birçok olay zaten tanımlanmış, yeni bir sms aldı , gönderilen, telefon önyüklenir), belirtilen alıcı, ekran görüntüsü almak için kod içerecek ve alıcıda bulunan belirli olaylar üzerinde çalışacaktır. SADECE SINIRLAMA, alıcınızı sadece PROSE PREDEFINED olaylarında kullanabileceğiniz IS. Bu senin için çalışacaksa. 2 ay önce yazdığım kodu paylaşacağım .. :) –

0

Manifest'inizde Dosya-

012 belirtilen edilecek alıcısı

Bu eylemde olduğu gibi diğer işlemleri de seçebilirsiniz. NOT: Alıcınızda kullanacağınız eylemler için izinler eklemeyi unutmayın.

public class EventReceiver extends BroadcastReceiver { 
private File imageFile; 
private Context mContext; 

@Override 
public void onReceive(final Context context, Intent intent) { 
    mContext=context; 
    takeScreenshot(); 
//you can execute some of your other code also 

} 
private void takeScreenshot() { 
    try { 
     String mPath = Environment.getExternalStorageDirectory().toString() +"\\/pic"; 
     View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 

     imageFile = new File(mPath); 

     FileOutputStream outputStream = new FileOutputStream(imageFile); 
     int quality = 100; 
     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 

}

bunu kullanın ve alıcı sınıfının OnReceive() Belirli etkinlik eylem idam alacak - Bu (bu durumda alarak ekran görüntüleri) kodunuzu yazacak alıcı sınıftır manifestinizde belirttiğiniz

İlgili konular