android—利用反射實現的螢幕錄製技術

來源:互聯網
上載者:User

ScreenShotService.java

package com.screenshot.ui;import android.annotation.SuppressLint;import android.app.Service;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Environment;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.view.View;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.lang.reflect.Field;public class ScreenShotService extends Service {public static final boolean SSS_DEFAULT_START = false;public static final boolean SSS_START = true;public static final boolean SSS_STOP = false;public static final String TRANSCRIBE_TAG = "TRANSCRIBE_TAG";public static final long SSS_DELAY_MILLIS = 100L;public static final  String SSS_FILE_PATH = "/luzhi/";public static final int SSS_MSG_WHAT = 256;private ScreenShotServiceHandler handler;private boolean isStart = SSS_STOP;private View[] getWindowDecorViews() throws Exception {Class<?> windowManager = Class.forName("android.view.WindowManagerImpl");Field viewsField = windowManager.getDeclaredField("mViews");Field instanceField = windowManager.getDeclaredField("mWindowManager");viewsField.setAccessible(true);instanceField.setAccessible(true);Object instance = instanceField.get(null);View[] viewarray = (View[]) viewsField.get(instance);if ((viewarray == null) || (viewarray.length < 0)) {return null;}int i = 0;View[] views = new View[viewarray.length];for (View v : viewarray) {views[i++] = v;}int[] arrayOfInt = new int[2];View localView;int j = 0;int length = views.length;for (i = 0; i < length; i++) {localView = views[i];localView.getLocationOnScreen(arrayOfInt);if ((arrayOfInt[0] > 0) || (arrayOfInt[1] > 0)) {for (j = i + 1; j < views.length; j++) {views[j - 1] = views[j];}views[views.length - 1] = localView;length--;i--;}}return views;}private void savePic(Bitmap paramBitmap, String paramString) {FileOutputStream fos = null;try {fos = new FileOutputStream(paramString);if (null != fos) {paramBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);fos.flush();fos.close();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private void screenShot() {try {View[] arrayOfView = getWindowDecorViews();Bitmap localBitmap = view2Bitmap(arrayOfView);new saveFileThread(localBitmap).start();} catch (Exception localException) {localException.printStackTrace();}}private Bitmap view2Bitmap(View paramView) {Log.e("saveFileThread view2Bitmap(View view)");paramView.setDrawingCacheEnabled(true);paramView.buildDrawingCache();Bitmap localBitmap1 = paramView.getDrawingCache();Bitmap localBitmap2 = null;if (localBitmap1 != null) {localBitmap2 = Bitmap.createBitmap(localBitmap1);}paramView.destroyDrawingCache();return localBitmap2;}private Bitmap view2Bitmap(View[] paramArrayOfView) {Canvas localCanvas = null;Paint localPaint = null;Bitmap newbitmap = null;int[] arrayOfInt = new int[2];for (View localView : paramArrayOfView) {Bitmap localBitmap = view2Bitmap(localView);localView.getLocationOnScreen(arrayOfInt);if (localBitmap != null) {if (localCanvas == null) {newbitmap = Bitmap.createBitmap(localView.getWidth(),localView.getHeight(), Config.ARGB_8888);// 建立一個新的和SRClocalCanvas = new Canvas(newbitmap);localPaint = new Paint();}localCanvas.drawBitmap(localBitmap, arrayOfInt[0],arrayOfInt[1], localPaint);localBitmap.recycle();localBitmap = null;}}if (localCanvas != null) {localCanvas.save(Canvas.ALL_SAVE_FLAG);// 儲存localCanvas.restore();// 儲存}return newbitmap;}public IBinder onBind(Intent paramIntent) {return null;}public void onCreate() {super.onCreate();Log.e("ScreenShotService onCreate");handler = new ScreenShotServiceHandler();}public void onStart(Intent paramIntent, int paramInt) {super.onStart(paramIntent, paramInt);Log.e("ScreenShotService onStart -----start----");String str = TRANSCRIBE_TAG;boolean localstart = paramIntent.getBooleanExtra(str, SSS_DEFAULT_START);if (this.isStart != localstart) {this.isStart = localstart;if (this.isStart == SSS_START) {handler.sendEmptyMessageDelayed(SSS_MSG_WHAT, SSS_DELAY_MILLIS);} else {handler.removeMessages(SSS_MSG_WHAT);}}}@SuppressLint({ "HandlerLeak", "HandlerLeak" })private class ScreenShotServiceHandler extends Handler {public void handleMessage(Message paramMessage) {if (paramMessage.what == SSS_MSG_WHAT) {ScreenShotService.this.screenShot();if (ScreenShotService.this.isStart) {ScreenShotService.this.handler.sendEmptyMessageDelayed(SSS_MSG_WHAT, SSS_DELAY_MILLIS);}}}}private class saveFileThread extends Thread {private Bitmap mbitmap;public saveFileThread(Bitmap arg2) {this.mbitmap = arg2;}public void run() {if (this.mbitmap == null) {Log.e("saveFileThread run mbitmap is null ");}File localFile1 = Environment.getExternalStorageDirectory();File localFile2 = new File(localFile1, SSS_FILE_PATH);if (!localFile2.exists()) {localFile2.mkdirs();}String filename = localFile2.getAbsolutePath() + "/"+ System.currentTimeMillis() + ".png";Log.e("saveFileThread run picPath = " + filename);ScreenShotService.this.savePic(mbitmap, filename);this.mbitmap.recycle();this.mbitmap = null;}}}

PlayActivity.java

package com.screenshot.ui;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.Window;import android.view.WindowManager;import android.widget.ImageView;import java.io.File;import java.util.Arrays;import java.util.Comparator;import com.screenshot.R;public class PlayActivity extends Activity {private PlayActivityHandler mHandler;private ImageView play_iv;private File[] arrayOfFile2;private File[] getFileList() {File localFile1 = Environment.getExternalStorageDirectory();File localFile2 = new File(localFile1, ScreenShotService.SSS_FILE_PATH);File[] arrayOfFile;if (!localFile2.exists()) {return null;}arrayOfFile = localFile2.listFiles();Arrays.sort(arrayOfFile, new Comparator<File>() {@Overridepublic int compare(File paramFile1, File paramFile2) {long file1name = Long.valueOf(getFileNameNoEx(paramFile1.getName()));long file2name = Long.valueOf(getFileNameNoEx(paramFile2.getName()));return (int) (file1name - file2name);}});return arrayOfFile;}private void play() {arrayOfFile2 = getFileList();mHandler.setCount(0);mHandler.sendEmptyMessageDelayed(ScreenShotService.SSS_MSG_WHAT,ScreenShotService.SSS_DELAY_MILLIS);}public String getExtensionName(String paramString) {if ((paramString != null) && (paramString.length() > 0)) {int i = paramString.lastIndexOf('.');if (i > -1) {int j = paramString.length() + -1;if (i < j) {int k = i + 1;paramString = paramString.substring(k);}}}return paramString;}public String getFileNameNoEx(String paramString) {if ((paramString != null) && (paramString.length() > 0)) {int i = paramString.lastIndexOf('.');if (i > -1) {int j = paramString.length();if (i < j)paramString = paramString.substring(0, i);}}return paramString;}protected void onCreate(Bundle paramBundle) {super.onCreate(paramBundle);// 設定無標題requestWindowFeature(Window.FEATURE_NO_TITLE);// 設定全屏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.play);this.play_iv = (ImageView) findViewById(R.id.play_iv);mHandler = new PlayActivityHandler();play();}private class PlayActivityHandler extends Handler {private int count = 0;//private Bitmap localBitmap;public void setCount(int vaule) {count = vaule;}@Overridepublic void handleMessage(Message msg) {if (arrayOfFile2 != null && count < arrayOfFile2.length) {Bitmap localBitmap = BitmapFactory.decodeFile(arrayOfFile2[count++].getAbsolutePath());play_iv.setImageBitmap(localBitmap);mHandler.sendEmptyMessageDelayed(ScreenShotService.SSS_MSG_WHAT,ScreenShotService.SSS_DELAY_MILLIS);}}}}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.