我正在开发一款应用,以便在您完成游戏后分享屏幕截图。 我制作了一个示例应用程序,其中我使用与我当前活动中使用的相同代码截取屏幕截图。不幸的是,当我将相同的代码应用于我的游戏时,其中包括一个对话框,它甚至没有截屏,也没有将它存储在以太网中。相反,它打开了分享意图。
这是我到目前为止所做的。请告诉我问题出在哪里,或者给我一个如何解决这个问题的建议。
对话框代码
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更多
答案 0 :(得分:0)
对话框的问题是它在另一个窗口中,并且有另一个根视图,然后是您的活动。因此它不会出现在您的屏幕截图中。 试试这个图书馆:https://github.com/jraska/Falcon。 它包含所有活动窗口的截图,包括对话框,可以找出问题所在。