如何在我的Android应用程序中进行屏幕截图

4
我想在我的Android应用程序中截屏。由于我不熟悉Java,因此我使用了在网上找到的一些代码。以下是目前为止我所写的代码。
public void screenshot(View view){
    View v = view.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap b = v.getDrawingCache();
    String extr = Environment.getExternalStorageDirectory().toString();
    File myPath = new File(extr, getString(R.string.new_image)+".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();
    }
}

当我按下调用我的方法的按钮时,日志显示如下:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/newimg.jpg: open failed: EACCES (Permission denied)
这是我在清单文件中拥有的权限:
<uses-permission
    android:required="true"
    android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
    android:required="true"
    android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission
    android:required="true"
    android:name="android.permission.INTERNET"/>
<uses-permission
    android:required="true"
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
    android:required="true"
    android:name="android.permission.READ_EXTERNAL_STORAGE"/>

如果有人能够帮我进一步,我也很想知道如何截取屏幕的某个部分,比如我的VideoView小部件,而不是整个屏幕(或者可能在将截图存储到相册/SD卡之前裁剪截图的方法)。

非常感谢任何建议。


在模拟器上运行?试试在真实设备或Bluestacks上运行。 - Lokanath
2个回答

0

在运行时必须请求权限,否则会出现EACCES(拒绝访问)错误,请参见安卓网站上的M Docs请求权限

将要使用的权限添加到列表中。

    String[] perms = {"android.permission.RECORD_AUDIO", "android.permission.CAMERA"};
    int permsRequestCode = 200; 
    requestPermissions(perms, permsRequestCode);

当用户授予权限或拒绝授权时,将触发此操作

@Override

public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){

    switch(permsRequestCode){

        case 200:

            boolean audioAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;

            boolean cameraAccepted = grantResults[1]==PackageManager.PERMISSION_GRANTED;

            break;

    }

}

0

尝试下面的代码:

public void screenshot(View view){
    View v = view.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap b = v.getDrawingCache();
    File root = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "/Your Folder Name");
    root.mkdir();
    Calendar localCalendar = Calendar.getInstance();
    String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(localCalendar.getTime());
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(new File(root.getAbsolutePath(), fileName + ".jpg"));
        b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    //After run code See your folder     
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

添加到 Androidmanifest.xml 文件

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接