Android 更改方向后以编程方式拍摄屏幕截图

Android 更改方向后以编程方式拍摄屏幕截图,android,android-fragments,screenshot,screen-orientation,Android,Android Fragments,Screenshot,Screen Orientation,我正在开发一个应用程序,它将截图保存为PDF格式,然后通过Google Cloud Print发送打印。一切正常,但我有一个关于屏幕截图方向的问题 对于主体片段,我制作了横向和纵向布局。屏幕截图必须始终是纵向的,所以我们的想法是通过编程将屏幕旋转到纵向,拍摄屏幕截图,然后将屏幕方向设置回传感器。我使用此方法更改配置: public void lockScreenOrientation(String orientation) { if (orientation.contains(

我正在开发一个应用程序,它将截图保存为PDF格式,然后通过Google Cloud Print发送打印。一切正常,但我有一个关于屏幕截图方向的问题

对于主体片段,我制作了横向和纵向布局。屏幕截图必须始终是纵向的,所以我们的想法是通过编程将屏幕旋转到纵向,拍摄屏幕截图,然后将屏幕方向设置回传感器。我使用此方法更改配置:

public void lockScreenOrientation(String orientation) {     
    if (orientation.contains("portrait")) {
        mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);            
    } else if (orientation.contains("auto")) {
        mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
    }
}
屏幕截图和PDF创建发生在由主机片段中的确认对话框触发的异步任务中

if (print) {            
        new AsyncPDF(mActivity).execute(field_client_name_txt, "birthday");
        prefs.edit().putBoolean("Print", false).commit();
}
当方向是纵向时,一切都很好!当必须将方向旋转到纵向以进行屏幕截图和打印时,就会出现问题截图捕获的是横向布局的图像,而不是纵向布局的图像,最终的pdf文件凌乱且被裁剪

以下是我的异步任务供参考:

public class AsyncPDF extends AsyncTask<String, Void, Void> {

Activity mActivity;
Context mContext;

private static final int REQUEST_CODE = 4;

private static String SDCARD = Environment.getExternalStorageDirectory().getPath();
private static String DIRECTORY = SDCARD + "/Amorino";
private static String DIR_CACHE = DIRECTORY + "/Cache/";
private static String DIR_BIRTHDAY_ORDERS = DIRECTORY + "/Orders/Birthday/";
private static String DIR_WEDDING_ORDERS = DIRECTORY + "/Orders/Wedding/";
private static String DIR_OTHER_ORDERS = DIRECTORY + "/Orders/Other/";
private static String DIR_PRODUCTION = DIRECTORY + "/Production/";

String pdfName, pdfType = "";
Utils mUtility;

public AsyncPDF(Activity activity) {
    this.mActivity = activity;
    this.mContext = activity;
}

@Override
protected void onPreExecute() {
    mUtility = new Utils(mContext);
    Toast.makeText(mActivity, "Αποθήκευση αρχείου...", Toast.LENGTH_SHORT)
            .show();
        screenCapture();
};

@Override
protected Void doInBackground(String... params) {

    pdfName = params[0];
    pdfType = params[1];

    createPdf();

    return null;
}

@Override
protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);

}

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    clearCacheFolder(); 
    Toast.makeText(mActivity, "Το αρχείο αποθηκέυτηκε επιτυχώς!",
            Toast.LENGTH_SHORT).show();

}

private void screenCapture() {

    try {

        ScrollView mLayoutRoot = (ScrollView) mActivity
                .findViewById(R.id.print_screen_layout);

        mLayoutRoot.setDrawingCacheEnabled(true);
        mLayoutRoot.buildDrawingCache();

        Bitmap mBitmap = mLayoutRoot.getDrawingCache();
        File file, f = null;
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
            file = new File(DIR_CACHE);
            if (!file.exists()) {
                file.mkdirs();
            }

            f = new File(file.getAbsolutePath() + File.separator
                    + "temp_layout" + ".png");
        }
        FileOutputStream ostream = new FileOutputStream(f);
        mBitmap.compress(CompressFormat.PNG, 10, ostream);
        ostream.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private void createPdf() {

    Document document = new Document();
    Image header_img, main_img;
    InputStream inputStream_header = null;
    String current_directory = "";

    try {

        AssetManager mngr = mContext.getAssets();

        if (pdfType.contains("birthday")) {
            inputStream_header = mngr.open("header_birthday.png");
            current_directory = DIR_BIRTHDAY_ORDERS;
        } else if (pdfType.contains("wedding")) {
            inputStream_header = mngr.open("header_wedding.png");
            current_directory = DIR_WEDDING_ORDERS;
        } else if (pdfType.contains("other")) {
            inputStream_header = mngr.open("header_order.png");
            current_directory = DIR_OTHER_ORDERS;
        } else if (pdfType.contains("production")) {
            inputStream_header = mngr.open("header_order.png");
            current_directory = DIR_PRODUCTION;
        }

        File file = new File(current_directory);
        if (!file.exists()) {
            file.mkdirs();
        }

        PdfWriter.getInstance(document, new FileOutputStream(
                current_directory + "/" + pdfName + ".pdf"));
        document.open();

        Bitmap bmp = BitmapFactory.decodeStream(inputStream_header);
        ByteArrayOutputStream stream_header = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream_header);
        header_img = Image.getInstance(stream_header.toByteArray());
        header_img.scalePercent(24f);
        header_img.setAbsolutePosition(-1f, 750f);
        document.add(header_img);

        Paragraph paragraph = new Paragraph(
                header_img.getScaledHeight() + 50f);
        document.add(paragraph);

        main_img = Image.getInstance(DIR_CACHE
                + "/temp_layout.png");

        main_img.scaleToFit(520f, 2000f);
        main_img.setAlignment(Image.ALIGN_CENTER);

        Log.d("Original Width: ", String.valueOf(main_img.getWidth()));
        Log.d("Original Height ", String.valueOf(main_img.getHeight()));
        Log.d("Scaled Width: ", String.valueOf(main_img.getScaledWidth()));
        Log.d("Scaled Height ", String.valueOf(main_img.getScaledHeight()));

        document.add(main_img);

        document.close();
        File f = new File(current_directory + "/" + pdfName + ".pdf");
        printPdf(f, pdfName);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

private void printPdf(File f, String name) {
    Uri docUri = Uri.fromFile(f);
    Intent printIntent = new Intent(mContext, PrintDialogActivity.class);
    printIntent.setDataAndType(docUri, "application/pdf");
    printIntent.putExtra("title", name + ".pdf");
    mActivity.startActivityForResult(printIntent, REQUEST_CODE);
}

private void clearCacheFolder() {
    File dir = new File(DIR_CACHE);
    if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            new File(dir, children[i]).delete();
        }
    }
}
public类AsyncPDF扩展AsyncTask{
活动能力;
语境;
私有静态最终整数请求_代码=4;
私有静态字符串SDCARD=Environment.getExternalStorageDirectory().getPath();
私有静态字符串目录=SDCARD+“/Amorino”;
私有静态字符串DIR_CACHE=DIRECTORY+“/CACHE/”;
私有静态字符串DIR_birth_ORDERS=DIRECTORY+“/ORDERS/birth/”;
私有静态字符串DIR_WEDDING_ORDERS=DIRECTORY+“/ORDERS/WEDDING/”;
私有静态字符串DIR_OTHER_ORDERS=DIRECTORY+“/ORDERS/OTHER/”;
私有静态字符串DIR_PRODUCTION=DIRECTORY+“/PRODUCTION/”;
字符串pdfName,pdfType=“”;
UTIL沉默;
公共PDF(活动){
这个。活动=活动;
this.mContext=活动;
}
@凌驾
受保护的void onPreExecute(){
mUtility=新UTIL(mContext);
Toast.makeText(mActivity,“πθεκεεσηαρχεεείΓ…”,Toast.LENGTHοu SHORT)
.show();
截屏();
};
@凌驾
受保护的Void doInBackground(字符串…参数){
pdfName=params[0];
pdfType=params[1];
createPdf();
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onProgressUpdate(值);
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
clearCacheFolder();
Toast.makeText(mActivity,“thetοαρχείαπεοθηκέέτηκεεπιτχώς!”,
吐司。长度(短)。show();
}
私有void截屏(){
试一试{
ScrollView mLayoutRoot=(ScrollView)MacActivity
.findViewById(R.id.打印屏幕布局);
mLayoutRoot.setDrawingCacheEnabled(true);
mLayoutRoot.buildDrawingCache();
位图mBitmap=mLayoutRoot.getDrawingCache();
文件,f=null;
如果(android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_){
文件=新文件(目录缓存);
如果(!file.exists()){
mkdirs()文件;
}
f=新文件(File.getAbsolutePath()+File.separator
+“临时布局”+“.png”);
}
FileOutputStream ostream=新的FileOutputStream(f);
mBitmap.compress(CompressFormat.PNG,10,ostream);
ostream.close();
}捕获(例外e){
e、 printStackTrace();
}
}
私有void createPdf(){
文档=新文档();
图像头\u img,主\u img;
InputStream InputStream_头=null;
字符串current_directory=“”;
试一试{
AssetManager mngr=mContext.getAssets();
if(pdfType.contains(“生日”)){
inputStream_header=mngr.open(“header_birth.png”);
当前目录=目录生日订单;
}else if(pdfType.contains(“婚礼”)){
inputStream_header=mngr.open(“header_.png”);
当前目录=目录;
}else if(pdfType.contains(“其他”)){
inputStream_header=mngr.open(“header_order.png”);
当前目录=目录或其他订单;
}else if(pdfType.contains(“生产”)){
inputStream_header=mngr.open(“header_order.png”);
当前目录=生产目录;
}
文件=新文件(当前目录);
如果(!file.exists()){
mkdirs()文件;
}
getInstance(文档,新文件输出流(
当前_目录+“/”+pdfName+“.pdf”);
document.open();
位图bmp=BitmapFactory.decodeStream(inputStream\u头);
ByteArrayOutputStream_头=新建ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG,100,流标题);
header_img=Image.getInstance(stream_header.toByteArray());
头部图像比例百分比(24f);
收割台安装绝对位置(-1f,750f);
文件。添加(标题\u img);
段落=新段落(
收割台(如getScaledHeight()+50f);
文件.添加(第段);
main\u img=Image.getInstance(DIR\u缓存
+“/temp_layout.png”);
主刻度盘配件(520f,2000f);
主图像设置对齐(图像对齐中心);
Log.d(“原始宽度:”,String.valueOf(main_img.getWidth());
Log.d(“原始高度”,String.valueOf(main_img.getHeight());
Log.d(“缩放宽度:”,String.valueOf(main_img.getScaledWidth());
Log.d(“缩放高度”,String.valueOf(main_img.getScaledHeight());
文件。添加(主界面);
document.close();
文件f=新文件(当前_目录+“/”+pdfName+“.pdf”);
printPdf(f,pdfName);
}捕获(例外e){
e、 printStackTrace();
}
}
私有void printPdf(文件f,字符串名称){
Uri docUri=Uri.fromFile(f);
意向打印意向=新意向(mCo)
public void print(String orientation) {

    print = prefs.getBoolean("print", false);

    if (print)
        if (orientation.contains("portrait")) {
            new AsyncPDF(mActivity, v).execute(field_client_name_txt,
                    "birthday");
        } else {
            ViewTreeObserver observer = v.getViewTreeObserver();
            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    /* Adds a minimal wait time for the view to settle */
                    final Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            new AsyncPDF(mActivity, v).execute(
                                    field_client_name_txt, "birthday");
                        }
                    }, 100);

                    v.getViewTreeObserver().removeOnGlobalLayoutListener(
                            this);
                }
            });
        }
    /* Reset the print flag to false */
    prefs.edit().putBoolean("print", false).commit();
}
public void onClick(DialogInterface dialog, int id) {
     prefs.edit().putBoolean("print", true).commit();
     if (mUtility.getScreenOrientation() == 1)
          print("portrait");
     else
          mUtility.lockScreenOrientation("portrait");
     }
});