2013-11-22 34 views
14

Uygulamam her 200 milisaniye için arka planda yüklendiğinde ve çalıştırıldığında programlı olarak Android cihazının veya emülatörün ekran görüntülerine ihtiyacım var ve görüntüleri bilgisayarıma kaydediyorum. Bu kodu aşağıdaki kodu kullanarak uyguladım ve yalnızca başvurum ön planda olduğunda çalışıyor. Uygulamam da arka planda olduğunda ekran görüntüsü almak istiyorum.Android - Programlı olarak ekran görüntüsü nasıl alınır

public static Bitmap takeScreenshot(Activity activity, int ResourceID) { 
    Random r = new Random(); 
    int iterator=r.nextInt(); 
    String mPath = Environment.getExternalStorageDirectory().toString() + "/screenshots/"; 
    View v1 = activity.getWindow().getDecorView().findViewById(ResourceID); 
    v1.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
      MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    v1.layout(0, 0, v1.getMeasuredWidth(), v1.getMeasuredHeight()); 
    v1.setDrawingCacheEnabled(true); 
    final Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
    Bitmap resultBitmap = Bitmap.createScaledBitmap(bitmap, 640, 480, false); 
    v1.setDrawingCacheEnabled(false); 
    File imageFile = new File(mPath); 
    imageFile.mkdirs(); 
    imageFile = new File(imageFile+"/"+iterator+"_screenshot.png"); 
    try { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     resultBitmap.compress(CompressFormat.PNG, 100, bos); 
     byte[] bitmapdata = bos.toByteArray(); 

     //write the bytes in file 
     FileOutputStream fos = new FileOutputStream(imageFile); 
     fos.write(bitmapdata); 
     fos.flush(); 
     fos.close();  
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return bitmap; 
    } 

Nasıl programlı Devices -> DDMS yılında Screencapture Refresh ve kaydet düğmelerinin işlevleri uygulayabilirsiniz: Aşağıda benim kodudur? Bunu başarabilir miyim?

+9

için iznini ekleyin. Bunu yaptığınız uygulamalar ciddi güvenlik endişeleri doğurur. –

+1

** Bu telefon köklü (* kitkat *) ** dışında yapamazsınız. “Ciddi güvenlik endişeleri” ile ilgili olarak, başka yerlerde daha ciddi güvenlik endişeleri olduğunu düşünüyorum. Uygulama ekran görüntüsünü almak için izin isteyebilirse, büyük bir sorun değil. –

+2

Bu bir ekran görüntüsü değil ... Bu her 200 ms'de bir ekran görüntüsü. Aslında 5 FPS videosu. Bu, telefonda yapılan her şeyi kolayca yakalayabilir. Kendi kullanımımla (bir uygulamanın videosunu yapmak) yapmaya karşı savunmamakla birlikte, 3. taraf bir uygulamada ekran görüntüsü almak için izin vermek, aşağı inmek için uzun bir tavşan deliği olacaktır. –

cevap

15

telefonunuz o zaman bu

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

deneyin bitmap olarak img.png okuyup

Bitmap screen = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+   
File.separator +"img.png"); 

//my code for saving 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    screen.compress(Bitmap.CompressFormat.JPEG, 15, bytes); 

//you can create a new file name "test.jpg" in sdcard folder. 

File f = new File(Environment.getExternalStorageDirectory()+ File.separator + "test.jpg"); 
      f.createNewFile(); 
//write the bytes in file 
    FileOutputStream fo = new FileOutputStream(f); 
    fo.write(bytes.toByteArray()); 
// remember close de FileOutput 

    fo.close(); 

aşağıdaki gibi uygulama ise ekranda erişimi yok jpg dönüştürmek köklü edilirse Eğer köklü sürece arka plan, arka planda olsa bile yukarıdaki ekran herhangi bir ekranın en etkili ekranını alabilir.

Google köklenme olmadan ekran görüntüsü almak sağlayan bir kütüphaneye sahiptir

GÜNCELLEME, onu denedim, Ama en kısa sürede bellek akşam yemeği emin iam.

yapabilirsiniz, http://code.google.com/p/android-screenshot-library/

+0

Ekranda emülatörde çalışan ancak gerçek cihazda çekim yapmadı – Harsha

+0

Cihazınız kök mü? –

+0

hayır, liste öğesi kullanıcı lisk'i, bu mizanpaj bitmapini kaydetmemiz için gerekli olan paylaşma seçeneğiyle birlikte paylaşma detayı göstermeyi planladığımızda, daha sonra bu dosyayı ekrana alma ve emir iletimini amaçlayan öykünücü ile emülatörde çalışmasını gerçekleştirmemiz gerekir. gerçek olmayan iş için geliyor onun çalışma değil – Harsha

14

İşte bunu yapmanın yolu.

Android taking Screen shots through code

Sonuç Çıkış:

enter image description here

enter image description here

public class CaptureScreenShots extends Activity { 
    LinearLayout L1; 
    ImageView image; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.screen_shots); 
     L1 = (LinearLayout) findViewById(R.id.LinearLayout01); 
      Button but = (Button) findViewById(R.id.munchscreen); 
      but.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        View v1 = L1.getRootView(); 
        v1.setDrawingCacheEnabled(true); 
        Bitmap bm = v1.getDrawingCache(); 
        BitmapDrawable bitmapDrawable = new BitmapDrawable(bm); 
        image = (ImageView) findViewById(R.id.screenshots); 
        image.setBackgroundDrawable(bitmapDrawable); 
       } 
      }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.screen_shots, menu); 
     return true; 
    } 

} 
+2

Bu sadece uygulama ön planda ise işe yaramaz mıydı? –

+2

'Yeni BitmapDrawable (bitmap)' kurucusu kullanımdan kaldırılmıştır. Bunun yerine, image.setImageBitmap (bm) ' – Darpan

5

(ADB gibi), arka planda ekran görüntüsü alma grupları = 1003 (grafikler) gerektirir. Aksi takdirde sadece kendi işleminizin ekran görüntüsünü alabilirsiniz. Bu nedenle, yalnızca köklü bir cihazda yapabilir veya ADB yerel programını çalıştırarak yapabilirsiniz.

Yerli cpp kod örneği https://android.googlesource.com/platform/frameworks/base/+/android-4.3_r2.3/cmds/screencap/

bulunabilir Ve java kodunda yapmak istiyorsanız, Yüzey sınıfının gizli API erişmesi gereken edilebilir:

/** 
* Like {@link #screenshot(int, int, int, int)} but includes all 
* Surfaces in the screenshot. 
* 
* @hide 
*/ 
public static native Bitmap screenshot(int width, int height); 

Bu iki olmalıdır ICS sürümünden bu yana hem OK hem de GB gibi erken sürümlerde yerel cpp kodunu kontrol edebilirsiniz. Bununla birlikte, bazı Android cihazlarda, medya sistemi ve tuval vb. Uygulaması çok iyi değildir, bu nedenle, bu durumda herhangi bir video oynatmayı veya yüzey görünümü içeriğini yakalayamazsınız.

+4

kullanın. Bu yöntemin, Android 4.3 ve üstü sürümlerde kaldırıldığına dikkat edilmelidir. – Tom

0
private void takeScreenshot() throws IOException { 
    Date now = new Date(); 
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); 
    String fileName = now + ".jpg"; 
    try { 
     File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + ""); 
     folder.mkdirs(); //create directory 

     // create bitmap screen capture 
     View v1 = getWindow().getDecorView().getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 

     File imageFile = new File(folder, fileName); 
     imageFile.createNewFile(); 
     FileOutputStream outputStream = new FileOutputStream(imageFile); 
     int quality = 100; 

     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 

     Toast.makeText(MainActivity.this, "ScreenShot Captured", Toast.LENGTH_SHORT).show(); 

     MediaScannerConnection.scanFile(this, 
       new String[]{imageFile.toString()}, null, 
       new MediaScannerConnection.OnScanCompletedListener() { 
        public void onScanCompleted(String path, Uri uri) { 
         Log.i("ExternalStorage", "Scanned " + path + ":"); 
         Log.i("ExternalStorage", "-> uri=" + uri); 
        } 
       }); 
    } catch (Throwable e) { 
     // Several error may come out with file handling or OOM 
     e.printStackTrace(); 
    } 
} 

öğe seçili olay düğmesi click olayı veya seçenek menüsünden bu yöntemi ekleyin deneyin ve folder değişkende ben indirmenin yolunu sağlamıştır çünkü ekran görüntüsü İndirme klasöründe mağaza olacak Bu bile mümkün olup olmadığını değişiklik klasör path.In bildirim dosyası Bu beni çıldırır yazma

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

İlgili konular