打印屏幕并在Android中保存

时间:2018-04-02 04:32:40

标签: android

我有一个用于打印屏幕的活动并保存到图库,它适用于Android OS 5(Lollipop)和更早版本。 为什么OS 6及更高版本的代码不起作用。 请帮忙,谢谢。

这是我的活动:

private ImageView imgSS;

View view;
Bitmap bitmap;
ByteArrayOutputStream bytearrayoutputstream;
File file;
FileOutputStream fileoutputstream;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tes_screenshot);

    bytearrayoutputstream = new ByteArrayOutputStream();

    //main = getWindow().getDecorView().findViewById(android.R.id.content);
    imgSS = (ImageView)findViewById(R.id.imgSS);
    Button btnSS = (Button)findViewById(R.id.btnSS);
    btnSS.setOnClickListener(new View.OnClickListener(){
        public void onClick(View OnclickView){
            view = OnclickView.getRootView();
            view.setDrawingCacheEnabled(true);
            bitmap = Bitmap.createBitmap(view.getDrawingCache());
            view.buildDrawingCache(true);
            view.setDrawingCacheEnabled(false);
            imgSS.setImageBitmap(bitmap);
            view.setBackgroundColor(Color.parseColor("#999999"));

            //Save bitmap
            String extr = Environment.getExternalStorageDirectory().toString() + "//";
            String fileName = "tes.jpg";
            File myPath = new File(extr, fileName);
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(myPath);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                fos.flush();
                fos.close();
                MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Screen", "screen");
            }catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

2 个答案:

答案 0 :(得分:1)

您应用的目标版本是什么?

如果您的应用的目标版本是6或更高,您的应用所需的所有权限都将被禁用,并且在运行时您必须请求权限,一旦用户说允许,那么只有您可以继续操作

在您的代码中,您正在编写并将文件保存在externals文件夹中,因此您需要WRITE_EXTERNAL_STORAGE权限。

请参考此博客以在android中实现运行时权限: https://www.androidhive.info/2016/11/android-working-marshmallow-m-runtime-permissions/

如果您使用的是Xamarin,请参阅: https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/

答案 1 :(得分:0)

  

适用于Android OS 5(Lolipop)及更早版本。为什么操作系统android 6及以上此代码不起作用

操作系统android 6及以上版本,你需要问run time permission因为从Android 6.0开始(API级别23),用户在应用程序运行时授予应用程序权限,而不是在安装应用程序时授予权限

如何询问运行时权限的示例代码

String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
if (ActivityCompat.checkSelfPermission(MainActivity.this, permission)
                    != PackageManager.PERMISSION_GRANTED
){
 ActivityCompat.requestPermissions(MainActivity.this, new String[]
                        {permission},123);

}

这是good tutorial for run time permission

这是Android run-time permissions Library