Android4.0 이상 버전 백그라운드 서비스 크로스 프로세스 현재 화면 요약 캡처

4212 단어
최근에 개인이 안드로이드 앱을 하나 만들었는데 백엔드에서 현재 화면을 캡처하는 수요와 관련된다. 만약에 자신의 앱에서만 캡처하면 모두가 어떻게 하는지 알아야 한다. 관건은 백엔드에서 다른 앱이 현재 실행 중인 화면을 캡처하는 데 문제가 있다는 것이다.
본인은 일주일 정도 연구한 끝에 상대적으로 실행 가능한 방안을 찾았습니다.
이보 가빈의 글에서 그의 일부 코드를 참고해 준 것에 감사해야 한다. 이 소인간도 이 방면에 많은 정력을 기울였다.
물론 저는 안드로이드 개발을 처음 배웠을 뿐입니다. 만약에 잘못된 발언이 있으면 제때에 지적해 주십시오.
자신의Activity 인터페이스를 캡처한다(이곳은 주요 기능 코드만 대충 붙였을 뿐, 상세한 것은 스스로 인터넷에서 찾는다. 대부분은)
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
   
import android.app.Activity;  
import android.graphics.Bitmap;  
import android.graphics.Rect;  
import android.view.View;  
   
public class ScreenShot {  
   
    private static Bitmap takeScreenShot(Activity activity) {  
        // View       View  
        View view = activity.getWindow().getDecorView();  
        view.setDrawingCacheEnabled(true);  
        view.buildDrawingCache();  
        Bitmap b1 = view.getDrawingCache();  
   
        //          
        Rect frame = new Rect();  
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
        int statusBarHeight = frame.top;  
   
        //          
        int width = activity.getWindowManager().getDefaultDisplay().getWidth();  
        int height = activity.getWindowManager().getDefaultDisplay()  
                .getHeight();  
        //        
        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height  
                - statusBarHeight);  
        view.destroyDrawingCache();  
        return b;  
    }  
   
    private static void savePic(Bitmap b, File filePath) {  
        FileOutputStream fos = null;  
        try {  
            fos = new FileOutputStream(filePath);  
            if (null != fos) {  
                b.compress(Bitmap.CompressFormat.PNG, 100, fos);  
                fos.flush();  
                fos.close();  
            }  
        } catch (FileNotFoundException e) {  
            // e.printStackTrace();  
        } catch (IOException e) {  
            // e.printStackTrace();  
        }  
    }  
   
    public static void shoot(Activity a, File filePath) {  
        if (filePath == null) {  
            return;  
        }  
        if (!filePath.getParentFile().exists()) {  
            filePath.getParentFile().mkdirs();  
        }  
        ScreenShot.savePic(ScreenShot.takeScreenShot(a), filePath);  
    }  

백그라운드 서비스 크로스 프로세스 캡처
1. 안드로이드 4.0 이하 버전 백그라운드 캡처
JNI 방식으로 화면을 캡처하면 소스 환경이 필요한 단점이 있습니다. 자세한 내용은 다음을 참조하십시오.
http://blog.csdn.net/zmyde2010/article/details/6925498
http://www.cnblogs.com/dwayne/archive/2012/01/03/2311404.html
2,android 4.0~4.2 버전 백그라운드 캡처
이것은android를 반사할 수 있습니다.view.Surface 클래스에 대한 screenshot 메서드가 완료되었습니다.
sc = Class.forName("android.view.Surface");
method=sc.getMethod("screenshot", new Class[] {int.class, int.class});  
Object o = method.invoke(sc, new Object[]{(int) dims[0],(int) dims[1]});  
mScreenBitmap =(Bitmap)o;

이 방법의 장점은 ROOT가 필요 없고 4.0~4.2만 지원하면 4.3 버전은 적용되지 않는다는 단점이 있다.
또는 bufferframe를 통해 fb0을 읽지만 ROOT 권한이 필요할 것 같습니다
3,android 4.3 버전 백그라운드 캡처
4.3 버전에도 사실screenshot 방법이 존재하는데 그가 속한 모든 종류android에 불과하다.view.SurfaceControl이 모두 hide되었기 때문에 일반적인 반사로는 호출할 수 없습니다.
여기에서 저는 CSDN 리보 Garvin이라는 블로거의 방법(android4.3 캡처 기능의 시도와 실패 분석)을 참고하기 시작했습니다. 바로 PC에서adb셸/system/bin/screencap-p/sdcard/screenshot를 실행하는 것입니다.png 명령은 화면을 정확하게 캡처할 수 있지만 안드로이드에서 이 명령을 실행하면 오류가 발생합니다. 캡처된 그림 크기는 0입니다.개인적으로는 안드로이드에서 셸 명령을 실행하는 데 무슨 문제가 생긴 것 같습니다.
많은 방법을 시도한 후에 마침내 인터넷에서 해결 방법을 찾았다.
왜냐하면 우리가 명령을 실행하기 전에 ROOT 권한을 얻지 못했기 때문이다. 현재 핸드폰에 ROOT 권한이 있어도 프로그램에서 다시 ROOT 권한을 가져야 한다.
바로 런타임을 먼저 수행하는 것이다.getRuntime().exec ("su") 를 누르고 필요한 명령을 실행합니다.
그리고 우리는 SD카드에 생성된 정상적인 사진을 볼 수 있다.
이 방면의 인터넷에는 이미 상응하는 공구 꾸러미가 있어서 우리가 개발하면 적은 노력으로 갑절의 효과를 거둘 수 있다.
https://github.com/Trinea/android-common
우리가 해야 할 일은 그 안에 있는 Shell Utils를 인용한 다음에execCommand(String command,boolean is Root)를 호출하면 된다.
사용 방법은 Android Java Shell 명령 실행 을 참조하십시오.
요약: 4.0 이상 버전은 ROOT 방법을 우선적으로 고려하고 간단하며 통용적이다.ROOT가 없으면 시스템 버전을 판단하고 4.3 이하는 반사 호출을 통해 4.3 이상은 아직 잘 모르겠어요.

좋은 웹페이지 즐겨찾기