在对话框打开时不显示活动屏幕截图

时间:2015-07-24 12:34:50

标签: android dialog screenshot android-dialog

我正在开发一款应用,以便在您完成游戏后分享屏幕截图。 我制作了一个示例应用程序,其中我使用与我当前活动中使用的相同代码截取屏幕截图。不幸的是,当我将相同的代码应用于我的游戏时,其中包括一个对话框,它甚至没有截屏,也没有将它存储在以太网中。相反,它打开了分享意图。

这是我到目前为止所做的。请告诉我问题出在哪里,或者给我一个如何解决这个问题的建议。

对话框代码

private void showWinDialod() {

    ImageView winshare = (ImageView) win_dialog.findViewById(R.id.winshare);

    winshare.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Bitmap bitmap = takeScreenShot(activity);
            Log.e("Screenshot", "taken successfully");

            saveBitmap(bitmap);
            Log.e("Screenshot", "saved successfully");

             initShareIntent("image", "WOW You done it");
        }
    });

    win_dialog.show();
    win_dialog.getWindow().getDecorView()
            .setBackgroundResource(android.R.color.transparent);
}

这是代码takeScreenShot(activity)

private static Bitmap takeScreenShot(Activity activity) {
    View view = activity.getWindow().getDecorView();
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap b1 = view.getDrawingCache();
    Rect frame = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;
    int width = activity.getWindowManager().getDefaultDisplay().getWidth();
    int height = activity.getWindowManager().getDefaultDisplay()
            .getHeight();

    Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
            - statusBarHeight);
    view.destroyDrawingCache();
    Log.e("Screenshot", "taken successfully");
    return b;

}

这是saveBitmap(bitmap)代码

public void saveBitmap(Bitmap bitmap) {
    File imagePath = new File(Environment.getExternalStorageDirectory()
            + "/screenshot.png");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        Log.e("Screenshot", "saved successfully");

        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }

}

并在最后initShareIntent("image","WOW")

private void initShareIntent(String type, String _text) {
    // optional //internal storage
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_TEXT, _text);
    shareIntent.putExtra(
            Intent.EXTRA_STREAM,
            Uri.fromFile(new File(Environment.getExternalStorageDirectory()
                    + "/screenshot.png"))); // optional//use this when you
                                            // want to send an image
    shareIntent.setType("image/jpeg");
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    startActivity(Intent.createChooser(shareIntent, "send"));
}

public void saveBitmap(Bitmap bitmap) {
    File imagePath = new File(Environment.getExternalStorageDirectory()
            + "/screenshot.png");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        Log.e("Screenshot", "saved successfully");

        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }

}

如果我没有使用对话框,但当对话框打开时,此代码工作正常。

它拿截图但在存储时我得到了这个例外

07-24 18:06:41.846: E/GREC(21546):/storage/emulated/0/screenshot.png: open failed: EACCES (Permission denied)

07-24 18:06:41.846:E / GREC(21546):java.io.FileNotFoundException:/storage/emulated/0/screenshot.png:open failed:EACCES(Permission denied)07-24 18:06 :41.846:E / GREC(21546):at libcore.io.IoBridge.open(IoBridge.java:409) 07-24 18:06:41.846:E / GREC(21546):at java.io.FileOutputStream。(FileOutputStream.java:88) 07-24 18:06:41.846:E / GREC(21546):at java.io.FileOutputStream。(FileOutputStream.java:73) 07-24 18:06:41.846:E / GREC(21546):at com.game.guessemoji.MainActivity.saveBitmap(MainActivity.java:5118) 07-24 18:06:41.846:E / GREC(21546):at com.game.guessemoji.MainActivity $ 2.onClick(MainActivity.java:4323) 07-24 18:06:41.846:E / GREC(21546):在android.view.View.performClick(View.java:4475) 07-24 18:06:41.846:E / GREC(21546):在android.view.View $ PerformClick.run(View.java:18786) 07-24 18:06:41.846:E / GREC(21546):在android.os.Handler.handleCallback(Handler.java:730) 07-24 18:06:41.846:E / GREC(21546):在android.os.Handler.dispatchMessage(Handler.java:92) 07-24 18:06:41.846:E / GREC(21546):在android.os.Looper.loop(Looper.java:176) 07-24 18:06:41.846:E / GREC(21546):在android.app.ActivityThread.main(ActivityThread.java:5419) 07-24 18:06:41.846:E / GREC(21546):at java.lang.reflect.Method.invokeNative(Native Method) 07-24 18:06:41.846:E / GREC(21546):at java.lang.reflect.Method.invoke(Method.java:525) 07-24 18:06:41.846:E / GREC(21546):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1046) 07-24 18:06:41.846:E / GREC(21546):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 07-24 18:06:41.846:E / GREC(21546):at dalvik.system.NativeStart.main(Native Method) 07-24 18:06:41.846:E / GREC(21546):引起:libcore.io.ErrnoException:open failed:EACCES(Permission denied) 07-24 18:06:41.846:E / GREC(21546):at libcore.io.Posix.open(Native Method) 07-24 18:06:41.846:E / GREC(21546):at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 07-24 18:06:41.846:E / GREC(21546):at libcore.io.IoBridge.open(IoBridge.java:393) 07-24 18:06:41.846:E / GREC(21546):... 15更多

1 个答案:

答案 0 :(得分:0)

对话框的问题是它在另一个窗口中,并且有另一个根视图,然后是您的活动。因此它不会出现在您的屏幕截图中。 试试这个图书馆:https://github.com/jraska/Falcon。 它包含所有活动窗口的截图,包括对话框,可以找出问题所在。