2011-10-14 45 views
44

Trước hết tôi đang viết một ứng dụng gốc để quyền root không có vấn đề gì. Tôi đã tìm kiếm và tìm kiếm và tìm thấy rất nhiều mã mà không bao giờ làm việc cho tôi ở đây là những gì tôi đã ghép với nhau cho đến nay và sorta hoạt động. Khi tôi nói sorta tôi có nghĩa là nó làm cho một hình ảnh trên /sdcard/test.png của tôi tuy nhiên các tập tin là 0 byte và rõ ràng là không thể được xem.Android chụp màn hình theo chương trình

public class ScreenShot extends Activity{ 

View content; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.blank); 
    content = findViewById(R.id.blankview); 
    getScreen(); 
} 

private void getScreen(){ 
    Bitmap bitmap = content.getDrawingCache(); 
    File file = new File("/sdcard/test.png"); 
    try 
    { 
     file.createNewFile(); 
     FileOutputStream ostream = new FileOutputStream(file); 
     bitmap.compress(CompressFormat.PNG, 100, ostream); 
     ostream.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

Mọi trợ giúp về cách tôi có thể chụp ảnh màn hình qua Android sẽ được đánh giá cao cảm ơn bạn!

=== EDIT ===

Sau đây là tất cả những gì tôi đang sử dụng hình ảnh được thực hiện trên sdcard của tôi và không 0bytes còn nhưng toàn bộ điều là màu đen không có gì trên đó là. Tôi đã gắn kết hoạt động với nút tìm kiếm của tôi vì vậy khi tôi là một số nơi trên điện thoại của tôi tôi tìm kiếm báo chí dài và nó được cho là để có một ảnh chụp màn hình nhưng tôi chỉ nhận được một hình ảnh màu đen? Tất cả mọi thứ được thiết lập trong suốt vì vậy tôi nghĩ rằng nó nên lấy bất cứ thứ gì trên màn hình, nhưng tôi chỉ tiếp tục nhận đen

Manifest

<activity android:name=".extras.ScreenShot" 
    android:theme="@android:style/Theme.Translucent.NoTitleBar" 
    android:noHistory="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH_LONG_PRESS" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    </activity> 

XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00000000" 
    android:id="@+id/screenRoot">  
</LinearLayout> 

Ảnh chụp màn hình lớp

public class ScreenShot extends Activity{ 

View content; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screenshot); 
    content = findViewById(R.id.screenRoot); 
    ViewTreeObserver vto = content.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
     content.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     getScreen(); 
     } 
    }); 
} 

private void getScreen(){ 
    View view = content; 
    View v = view.getRootView(); 
    v.setDrawingCacheEnabled(true); 
    Bitmap b = v.getDrawingCache();    
    String extr = Environment.getExternalStorageDirectory().toString(); 
    File myPath = new File(extr, "test.jpg"); 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(myPath); 
     b.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     fos.flush(); 
     fos.close(); 
     MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen"); 
    }catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finish(); 
} 
} 

Trả lời

1

Tôi nghĩ rằng bạn phải đợi cho đến khi bố trí được vẽ completely..Use ViewTreeObserver để có được một cuộc gọi trở lại khi bố trí được vẽ hoàn toàn ..

On onCreate của bạn thêm cuộc gọi code..Only này getScreen từ bên onGlobalLayout() ..

ViewTreeObserver vto = content.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
    content.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    getScreen(); 
    } 
}); 

tôi hỏi một chút tương tự question once..Please thấy câu hỏi của tôi mà giải thích cách thức để chụp màn hình trong android..Hope này giúp

+0

k cảm ơn cho câu trả lời sẽ có một cái nhìn tại câu hỏi của bạn vào ngày mai chỉ là quá mệt mỏi vào lúc này. Tôi có một câu hỏi khác mặc dù làm thế nào đến gốc không được gọi là khi tôi làm điều này? và mã này sẽ chỉ chụp ảnh màn hình bố cục chỉ vì tôi muốn chụp ảnh màn hình về những gì trên màn hình tôi đã gắn nó vào phím tìm kiếm khi nhấn lâu – user577732

+0

Ok. Công trình của nó tốt. Nhưng nếu tôi đang sử dụng mã đó để chụp ảnh màn hình của chế độ xem camer thì nó sẽ không hoạt động. –

26

ở đây bạn đi ... tôi sử dụng điều này:

View v = view.getRootView(); 
v.setDrawingCacheEnabled(true); 
Bitmap b = v.getDrawingCache(); 
String extr = Environment.getExternalStorageDirectory().toString(); 
File myPath = new File(extr, getString(R.string.free_tiket)+".jpg"); 
FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(myPath); 
    b.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
    fos.flush(); 
    fos.close(); 
    MediaStore.Images.Media.insertImage(getContentResolver(), b, 
             "Screen", "screen"); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

v bố trí gốc iz ... chỉ cần đến điểm;)))

+0

Chế độ xem là gì ?? Tôi đang sử dụng mã của bạn nhưng tôi đã nhận được lỗi mà chế độ xem không thể được giải quyết. Vậy quan điểm là gì? –

+0

Xem là LinearLayout ... bạn phải thêm id vào bố cục tuyến tính hoặc tương đối của bạn (những gì bạn sử dụng) và trong onCreate bạn xác định nó như sau: View view = findViewById (R.id.linearLayoutRoot); sau đó y sử dụng phần còn lại của mã của tôi ... – Jovan

+0

Ok Cảm ơn. Tôi đạt được rồi. Và nó hoạt động tuyệt vời. Nhưng tôi cần một số trợ giúp của bạn nếu bạn có thể. –

0

You Take Screen Shot Như thế này ........

View view = findViewById(R.id.rellayout); 
     view.getRootView(); 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) 
     { 
      File picDir = new File(Environment.getExternalStorageDirectory()+ "/name"); 
      if (!picDir.exists()) 
      { 
       picDir.mkdir(); 
      } 
      view.setDrawingCacheEnabled(true); 
      view.buildDrawingCache(true); 
      Bitmap bitmap = view.getDrawingCache(); 
//   Date date = new Date(); 
      String fileName = "mylove" + ".jpg"; 
      File picFile = new File(picDir + "/" + fileName); 
      try 
      { 
       picFile.createNewFile(); 
       FileOutputStream picOut = new FileOutputStream(picFile); 
       bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));//Optional 
       boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut); 
       if (saved) 
       { 
        Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show(); 
       } else 
       { 
        //Error 
       } 
       picOut.close(); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      view.destroyDrawingCache(); 
     } else { 


     } 
4

Đối với người đọc tiếp theo của này question-

cách rất đơn giản để thực hiện điều này bằng cách vẽ cái nhìn của bạn để canvas-

vượt qua tham khảo bố cục chính của bạn vào đó phương pháp luận

Bitmap file = save(layout); 

Bitmap save(View v) 
    { 
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.draw(c); 
    return b; 
    } 
+0

rất đẹp, đây là bản cập nhật nhưng cách khác là hình ảnh tiền mặt và tệ –

1
public class MainActivity extends Activity 
{ 
Button btn; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    btn = (Button) findViewById(R.id.btn); 
    btn.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      // TODO Auto-generated method stub 
      Bitmap bitmap = takeScreenshot(); 
      saveBitmap(bitmap); 

     } 
    }); 
} 

public Bitmap takeScreenshot() 
{ 
    View rootView = findViewById(android.R.id.content).getRootView(); 
    rootView.setDrawingCacheEnabled(true); 
    return rootView.getDrawingCache(); 
} 

public void saveBitmap(Bitmap bitmap) 
{ 
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); 
    FileOutputStream fos; 
    try 
    { 
     fos = new FileOutputStream(imagePath); 
     bitmap.compress(CompressFormat.JPEG, 100, fos); 
     fos.flush(); 
     fos.close(); 
    } 
    catch (FileNotFoundException e) 
    { 
     Log.e("GREC", e.getMessage(), e); 
    } 
    catch (IOException e) 
    { 
     Log.e("GREC", e.getMessage(), e); 
    } 
} 
} 

không quên viết giấy phép lưu trữ bên ngoài!

0

Vấn đề của tôi là "TargetApi (23)" cần thiết nếu minSdkVersion của bạn dưới 23.

Vì vậy, tôi có quyền yêu cầu với đoạn mã sau

protected boolean shouldAskPermissions() { 
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1); 
} 

@TargetApi(23) 
protected void askPermissions() { 
    String[] permissions = { 
      "android.permission.READ_EXTERNAL_STORAGE", 
      "android.permission.WRITE_EXTERNAL_STORAGE" 
    }; 
    int requestCode = 200; 
    requestPermissions(permissions, requestCode); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
// ... 
    if (shouldAskPermissions()) { 
     askPermissions(); 
    } 
} 
Các vấn đề liên quan