国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 截屏實(shí)現(xiàn)的幾種方式

這篇具有很好參考價(jià)值的文章主要介紹了Android 截屏實(shí)現(xiàn)的幾種方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Android 截屏分為四種:View 截屏、WebView 截屏、系統(tǒng)截屏 和 adb 截屏

Android 截屏實(shí)現(xiàn)的幾種方式

image.png

Android 截屏實(shí)現(xiàn)的幾種方式

image.png

1、View 截屏

View 截圖是將當(dāng)前 View 界面截取下來(lái),而對(duì)于屏幕上其他信息比如:狀態(tài)欄或其他應(yīng)用的界面將無(wú)法截取。

1.1 截取除了導(dǎo)航欄之外的屏幕

    // 開始截屏
    private static byte[] screenshotView() {

        // ??? 可直接放入點(diǎn)擊事件中 ???
        View view = getWindow().getDecorView(); // view可以替換成你需要截圖的控件,如父控件 RelativeLayout,LinearLayout
        // view.setDrawingCacheEnabled(true); // 設(shè)置緩存,可用于實(shí)時(shí)截圖
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        // view.setDrawingCacheEnabled(false); // 清空緩存,可用于實(shí)時(shí)截圖

        String bitmapString = getBitmapString(bitmap); // 位圖轉(zhuǎn) Base64 String
        // byte[] drawByte = getBitmapByte(bitmap); // 位圖轉(zhuǎn)為 Byted

        Log.d("111111 合并>>", "bitmapString ====:" + bitmapString);
        matting_img02.setImageBitmap(bitmap); // ImageView控件直接圖片展示截好的圖片
        // ??? 可直接放入點(diǎn)擊事件中 ???

        return drawByte;
    }

    // 位圖轉(zhuǎn) Base64 String
    private static String getBitmapString(Bitmap bitmap) {
        String result = null;
        ByteArrayOutputStream out = null;
        try {
            if (bitmap != null) {
                out = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);

                out.flush();
                out.close();

                byte[] bitmapBytes = out.toByteArray();
                result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); // Base64.DEFAULT會(huì)自動(dòng)換行,傳給前端會(huì)報(bào)錯(cuò),所以要用Base64.NO_WRAP
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    // 位圖轉(zhuǎn) Byte
    private static byte[] getBitmapByte(Bitmap bitmap) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        // 參數(shù)1轉(zhuǎn)換類型,參數(shù)2壓縮質(zhì)量,參數(shù)3字節(jié)流資源
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        try {
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }



1.2 截取某個(gè)控件或者區(qū)域

// 方法1
private static byte[] screenshotView1() {
  View view = title;
  view.setDrawingCacheEnabled(true);
  view.buildDrawingCache();
  Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
  byte[] drawByte = getBitmapByte(bitmap);
  return drawByte;
}

// 方法2
private static byte[] screenshotView2() {
  View view = title;
  Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
  // 使用 Canvas,調(diào)用自定義 view 控件的 onDraw 方法,繪制圖片
  Canvas canvas = new Canvas(bitmap);
  dView.draw(canvas);
  byte[] drawByte = getBitmapByte(bitmap);
  return drawByte;
}

2、WebView 截屏

WebView 截屏有四種方式

2.1 使用 capturePicture() 方法(已廢棄)
private static byte[] screenshotWebView() {
Picture picture = webview.capturePicture();
//創(chuàng)建位圖
Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
// 繪制(會(huì)調(diào)用 native 方法,完成圖形繪制)
picture.draw(canvas);
byte[] drawByte = getBitmapByte(bitmap);
return drawByte;
}

2.2 使用 getScale() 方法(已廢棄)

private static byte[] screenshotWebView() {
float scale = webView.getScale();
int webViewHeight = (int) (webView.getContentHeight()*scale+0.5);
Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(),webViewHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
byte[] drawByte = getBitmapByte(bitmap);
return drawByte;
}

2.3 使用 getDrawingCache() 方法

private static byte[] screenshotWebView() {
Bitmap bitmap = webView.getDrawingCache();
byte[] drawByte = getBitmapByte(bmp);
return drawByte;
}

2.4 使用 draw() 方法

private static byte[] screenshotWebView() {
// webView.setDrawingCacheEnabled(true); // 設(shè)置緩存
Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
webView.destroyDrawingCache();
byte[] drawByte = getBitmapByte(bitmap);
// webView.setDrawingCacheEnabled(false); // 清空緩存
return drawByte;
}

2.5 截長(zhǎng)圖配置

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
WebView.enableSlowWholeDocumentDraw();
}
setContentView(R.layout.activity_webview);

WebView 截圖可能截取不到 cavans 元素,原因是開啟了硬件加速,可在 AndroidManifest.xml 中設(shè)置屬性 android:hardwareAccelerated="false"

關(guān)閉硬件加速可能導(dǎo)致頁(yè)面出現(xiàn)意外情況

3、系統(tǒng)截屏

3.1 MediaProjection

public static final int REQUEST_MEDIA_PROJECTION = 10001;
// 申請(qǐng)截屏權(quán)限
private void getScreenShotPower() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
MediaProjectionManager mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
if (mProjectionManager != null) {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
}
}
}

private MediaProjection mMediaProjection;
// 回調(diào)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_MEDIA_PROJECTION && data != null) {
if (resultCode == RESULT_OK) {
MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
if (mediaProjection == null) {
Toast.makeText(this,"程序發(fā)生錯(cuò)誤:MediaProjection@1",Toast.LENGTH_SHORT).show();
return;
}
// mediaProjection 就是當(dāng)前屏幕流
} else if (resultCode == RESULT_CANCELED) {
Log.d(TAG, "用戶取消");
}
}
}

3.2 Surface(需要 root 權(quán)限)

使用前需要:

在 AndroidMenifest.xml 中添加 android:sharedUserId="android.uid.system" 屬性
需要給程序添加系統(tǒng)簽名
或者 root 系統(tǒng)
使用 Java 反射機(jī)制,調(diào)用系統(tǒng) API 截圖:

private void screenshotSystem() {
Class<?> surfaceClass;
Method method = null;
Bitmap bitmap = null;
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
surfaceClass = Class.forName("android.view.SurfaceControl");
} else {
surfaceClass = Class.forName("android.view.Surface");
}
method = surfaceClass.getDeclaredMethod("screenshot", Integer.TYPE, Integer.TYPE);
method.setAccessible(true);
bitmap = (Bitmap)method.invoke((Object)null, webview.getWidth(), webview.getHeight());
byte[] drawByte = getBitmapByte(bitmap);
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (NoSuchMethodException e){
e.printStackTrace();
} catch (IllegalAccessException e){
e.printStackTrace();
} catch (InvocationTargetException e){
e.printStackTrace();
}
}

3.3 PixelCopy

private void screenshotSystem() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
PixelCopy.request(getWindow(), bitmap, new PixelCopy.OnPixelCopyFinishedListener() {
@Override
public void onPixelCopyFinished(int copyResult){
if (PixelCopy.SUCCESS == copyResult) {
byte[] drawByte = getBitmapByte(bitmap);
} else {
// onErrorCallback()
}
}
}, new Handler());
}
}

3.4 framebuffer(需要 root 權(quán)限)

String DEVICE_NAME = "/dev/graphics/fb0";
File deviceFile = new File(DEVICE_NAME);
Process localProcess = Runtime.getRuntime().exec("supersu");
String str = "cat " + deviceFile.getAbsolutePath() + "\n";
localProcess.getOutputStream().write(str.getBytes());
return localProcess.getInputStream();

3.5 screencap 命令(需要 root 權(quán)限)

private static String getScreenshot(){
Process process = null;
String filePath = "mnt/sdcard/" + System.currentTimeMillis() + ".png";
try {
process = Runtime.getRuntime().exec("su");
PrintStream outputStream = null;
outputStream = new PrintStream(new BufferedOutputStream(process.getOutputStream(), 8192));
outputStream.println("screencap -p " + filePath);
outputStream.flush();
outputStream.close();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(process != null){
process.destroy();
}
}
return filePath;
}文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-456991.html

4、adb 截屏

$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png

到了這里,關(guān)于Android 截屏實(shí)現(xiàn)的幾種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 實(shí)現(xiàn)跨域的幾種方式

    實(shí)現(xiàn)跨域的幾種方式

    前后端的分離導(dǎo)致了跨域的產(chǎn)生 ?跨域的三要素:協(xié)議 域名 端口 三者有一個(gè)不同即產(chǎn)生跨域 例如: http ://www.csdn.com https ://www.csdn.com 由于協(xié)議不同,端口不同而產(chǎn)生跨域 注:http的默認(rèn)端口80,https的默認(rèn)端口443 跨域的解決方案 前端:webpack proxy,jsonp,ngix反向代理,webpac

    2024年02月13日
    瀏覽(23)
  • 線程間實(shí)現(xiàn)通信的幾種方式

    線程間實(shí)現(xiàn)通信的幾種方式

    線程間通信的模型有兩種:共享內(nèi)存和消息傳遞,下面介紹的都是圍繞這兩個(gè)來(lái)實(shí)現(xiàn) 有兩個(gè)線程A和B,B線程向一個(gè)集合里面依次添加元素“abc”字符串,一共添加10次,當(dāng)添加到第五次的時(shí)候,希望線程A能夠收到線程B的通知,然后B線程執(zhí)行相關(guān)的業(yè)務(wù)操作 Object類提供了線程

    2024年02月15日
    瀏覽(24)
  • 單例模式的幾種實(shí)現(xiàn)方式

    在Java中,實(shí)現(xiàn)單例模式主要有幾種方式:懶漢式、餓漢式、雙重檢查鎖定、靜態(tài)內(nèi)部類和枚舉。每種方式都有其特點(diǎn)和適用場(chǎng)景。 1. 餓漢式(線程安全) 餓漢式是最簡(jiǎn)單的一種實(shí)現(xiàn)方式,通過(guò)靜態(tài)初始化實(shí)例,保證了線程安全。但它不是懶加載模式,無(wú)法在實(shí)際使用時(shí)才創(chuàng)

    2024年02月20日
    瀏覽(21)
  • Java實(shí)現(xiàn)異步的幾種方式

    Java實(shí)現(xiàn)異步的幾種方式

    普通線程實(shí)現(xiàn)異步,但頻繁創(chuàng)建、銷毀線程比較耗資源,所以一般交給線程池執(zhí)行 結(jié)果: Future異步 和普通線程實(shí)現(xiàn)異步區(qū)別不大,只是使用Future是要獲取執(zhí)行后的返回值 結(jié)果: Spring的@Async異步 使用@Async注解實(shí)現(xiàn)異步的前提是需要在啟動(dòng)類上標(biāo)注@EnableAsync來(lái)開啟異步配置

    2024年02月04日
    瀏覽(39)
  • 前端實(shí)現(xiàn)動(dòng)畫的幾種方式簡(jiǎn)介

    前端實(shí)現(xiàn)動(dòng)畫的幾種方式簡(jiǎn)介

    這里只是做簡(jiǎn)要介紹,屬于知識(shí)的拓展。每種方案的更詳細(xì)的使用方式需要各位自行了解。 大體上技術(shù)方案分為:CSS 動(dòng)畫、SVG 動(dòng)畫、CSS + SVG、JS 控制的逐幀動(dòng)畫、GIF 圖。 CSS 實(shí)現(xiàn)動(dòng)畫有兩種方式,一種是使用 trasition ;另一種是使用 animation 。 默認(rèn)情況下,當(dāng) CSS 中的屬性值

    2024年04月22日
    瀏覽(26)
  • JavaScript里實(shí)現(xiàn)繼承的幾種方式

    JavaScript 中的繼承可以通過(guò)以下幾種方式來(lái)實(shí)現(xiàn): 1、原型鏈繼承 :通過(guò)將子類的原型對(duì)象指向父類的實(shí)例來(lái)實(shí)現(xiàn)繼承。這種方式的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是父類的私有屬性和方法子類是不能訪問(wèn)的。 ? 2、借用構(gòu)造函數(shù)繼承 :通過(guò)在子類的構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù)來(lái)

    2023年04月23日
    瀏覽(20)
  • SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式

    SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式

    一、使用 CompletableFuture 實(shí)現(xiàn)異步任務(wù) CompletableFuture 是 Java 8 新增的一個(gè)異步編程工具,它可以方便地實(shí)現(xiàn)異步任務(wù)。使用 CompletableFuture 需要滿足以下條件: 異步任務(wù)的返回值類型必須是 CompletableFuture 類型; 在異步任務(wù)中使用 CompletableFuture.supplyAsync() 或 CompletableFuture.runAsy

    2024年02月08日
    瀏覽(23)
  • Qt 多線程的幾種實(shí)現(xiàn)方式

    Qt 多線程的幾種實(shí)現(xiàn)方式

    Qt多線程的實(shí)現(xiàn)方式有: 1. 繼承QThread類,重寫run()方法 2. 使用moveToThread將一個(gè)繼承QObject的子類移至線程,內(nèi)部槽函數(shù)均在線程中執(zhí)行 3. 使用QThreadPool,搭配QRunnable(線程池) 4. 使用QtConcurrent(線程池) 為什么要用線程池? 創(chuàng)建和銷毀線程需要和OS交互,少量線程影響不大,

    2024年02月15日
    瀏覽(23)
  • 分布式 ID 的幾種實(shí)現(xiàn)方式

    隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,分布式系統(tǒng)在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用。分布式 ID 是分布式系統(tǒng)中的一種重要概念,用于唯一標(biāo)識(shí)系統(tǒng)中生成的各種數(shù)據(jù)。在分布式環(huán)境下,如何高效、可靠地生成分布式 ID 是一個(gè)具有挑戰(zhàn)性的問(wèn)題。本文將介紹幾種常見(jiàn)的分布式 ID 實(shí)現(xiàn)方式

    2024年01月23日
    瀏覽(21)
  • vue深拷貝的幾種實(shí)現(xiàn)方式

    1、通過(guò)遞歸方式實(shí)現(xiàn)深拷貝 比較全面的深拷貝,缺點(diǎn)是較為繁瑣 2、JSON.parse(JSON.stringify(obj)) 滿足一般使用場(chǎng)景,但無(wú)法實(shí)現(xiàn)對(duì)象中方法(function)的深拷貝 3、jQuery的extend方法實(shí)現(xiàn)深拷貝 4、Object.assign(obj1, obj2) 只有一級(jí)屬性為深拷貝,二級(jí)屬性后就是淺拷貝 5、擴(kuò)展運(yùn)算符 只有

    2024年02月09日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包