android截屏

1.手机直接截屏
按住音量减+电源键
 
2.在shell里执行
screencap /sdcard/5111.png
 
3.在APK中使用代码

主要就是利用SDK提供的View.getDrawingCache()方法。网上已经有很多的实例了。首先创建一个android project,然后进行Layout,画一个按键(res/layout/main.xml):

<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
     android:orientation = "vertical"
     android:layout_width = "fill_parent"
     android:layout_height = "fill_parent"
     >
< TextView
     android:layout_width = "fill_parent"
     android:layout_height = "wrap_content"
     android:text = "@string/hello"
     />
< Button
   android:text = "NiceButton"
   android:id = "@+id/my_button"
   android:layout_width = "fill_parent"
   android:layout_height = "wrap_content"
   android:layout_alignParentBottom = "true" ></ Button >
</ LinearLayout >

HelloAndroid.java实现代码为:

package com.example.helloandroid;
  
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
  
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
  
public class HelloAndroid extends Activity {
  
   private Button button;
  
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
  
     super .onCreate(savedInstanceState);
     this .setContentView(R.layout.main);
     this .button = (Button) this .findViewById(R.id.my_button);
     this .button.setOnClickListener( new OnClickListener() {
  
       public void onClick(View v) {
         SimpleDateFormat sdf = new SimpleDateFormat(
             "yyyy-MM-dd_HH-mm-ss" , Locale.US);
         String fname = "/sdcard/" + sdf.format( new Date()) + ".png" ;
         View view = v.getRootView();
         view.setDrawingCacheEnabled( true );
         view.buildDrawingCache();
         Bitmap bitmap = view.getDrawingCache();
         if (bitmap != null ) {
           System.out.println( "bitmap got!" );
           try {
             FileOutputStream out = new FileOutputStream(fname);
             bitmap.compress(Bitmap.CompressFormat.PNG, 100 , out);
             System.out.println( "file " + fname + "output done." );
           } catch (Exception e) {
             e.printStackTrace();
           }
         } else {
           System.out.println( "bitmap is NULL!" );
         }
       }
  
     });
  
   }
}

这个代码会在按下app中按键的时候自动在手机的/sdcard/目录下生成一个时间戳命名的png截屏文件。

这种截屏有一个问题,就是只能截到一部分,比如电池指示部分就截不出来了。

 
4.在native层实现截图

示例代码在:

frameworks\base\services\surfaceflinger\tests\screencap\screencap.cpp

 

/* 

 * Copyright (C) 2010 The Android Open Source Project 

 * 

 * Licensed under the Apache License, Version 2.0 (the "License"); 

 * you may not use this file except in compliance with the License. 

 * You may obtain a copy of the License at 

 * 

 *      http://www.apache.org/licenses/LICENSE-2.0 

 * 

 * Unless required by applicable law or agreed to in writing, software 

 * distributed under the License is distributed on an "AS IS" BASIS, 

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

 * See the License for the specific language governing permissions and 

 * limitations under the License. 

 */ 

 

#include <utils/Log.h> 

 

#include <binder/IPCThreadState.h> 

#include <binder/ProcessState.h> 

#include <binder/IServiceManager.h> 

 

#include <binder/IMemory.h> 

#include <surfaceflinger/ISurfaceComposer.h> 

 

#include <SkImageEncoder.h> 

#include <SkBitmap.h> 

 

using namespace android; 

 

int main(int argc, char** argv) 

    if (argc != 2) { 

        printf("usage: %s path\n", argv[0]); 

        exit(0); 

    } 

 

    const String16 name("SurfaceFlinger"); 

    sp<ISurfaceComposer> composer; 

    getService(name, &composer); 

 

    sp<IMemoryHeap> heap; 

    uint32_t w, h; 

    PixelFormat f; 

    status_t err = composer->captureScreen(0, &heap, &w, &h, &f, 0, 0); 

    if (err != NO_ERROR) { 

        fprintf(stderr, "screen capture failed: %s\n", strerror(-err)); 

        exit(0); 

    } 

 

    printf("screen capture success: w=%u, h=%u, pixels=%p\n", 

            w, h, heap->getBase()); 

 

    printf("saving file as PNG in %s ...\n", argv[1]); 

 

    SkBitmap b; 

    b.setConfig(SkBitmap::kARGB_8888_Config, w, h); 

    b.setPixels(heap->getBase()); 

    SkImageEncoder::EncodeFile(argv[1], b, 

            SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality); 

 

    return 0; 

编译后生成/system/bin/test-screencap

测试时终端输入test-screencap /mnt/sdcard/scapxx.png

可以看到SD卡生成截屏文件scapxx.png,默认大小为屏幕分辨率

 

如果想把这个功能写到自己的应用里

写个JNI,参考上面代码即可,但记得权限声明

 

uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> 

当然最好是系统级实现,响应某个组合键来截屏,像Android4.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值