为了账号安全,请及时绑定邮箱和手机立即绑定

Android以编程方式拍摄屏幕快照

/ 猿问

Android以编程方式拍摄屏幕快照

繁星点点滴滴 2019-12-25 16:02:30

首先,我正在编写一个root应用程序,因此root权限没有问题。我经过搜索,发现很多对我没用的代码,这是到目前为止我拼凑而成的,仍然可以工作。当我说sorta时,我的意思是它在我的/sdcard/test.png上创建了一个图像,但是文件为0字节,显然无法查看。


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();

    }

}

}

非常感谢您对我如何通过代码在android屏幕截图提供任何帮助!


===编辑===


以下是我使用的所有图像都是在我的sdcard上制作的,不再是0bytes,而是整个东西都是黑色的,上面没有任何内容。我已将活动绑定到我的搜索按钮,所以当我在手机上的某个位置时,我会长按搜索,它应该进行屏幕截图,但我只会得到黑色图像?一切都设置为透明,所以我认为它应该可以抓住屏幕上的所有内容,但是我一直在变黑


表现


<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>

查看完整描述

3 回答

?
慕姐4208626

给你...我用这个:


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 iz根布局...只是指向;)))


查看完整回答
反对 回复 2019-12-25
?
绝地无双

对于这个问题的下一个读者-


通过在画布上绘制视图来完成此操作的最简单方法是


将您的主布局参考传递给此方法-


 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;

   }


查看完整回答
反对 回复 2019-12-25
?
德玛西亚99

我认为您必须等到布局完全绘制好。当布局完全绘制时,请使用ViewTreeObserver进行回调。


在您的onCreate上添加此代码。仅从onGlobalLayout()内部调用getScreen。


ViewTreeObserver vto = content.getViewTreeObserver();

vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  @Override

  public void onGlobalLayout() {

    content.getViewTreeObserver().removeGlobalOnLayoutListener(this);

    getScreen();

  }

});

我曾经问过一个类似的问题。.请参阅我的问题,该问题说明了在Android中拍摄屏幕截图的方式。希望这会有所帮助


查看完整回答
反对 回复 2019-12-25

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信