【发布时间】:2015-07-24 12:34:49
【问题描述】:
我正在开发一个应用程序,用于在您完成游戏后分享屏幕截图。 我制作了一个示例应用程序,在其中我使用我在当前活动中使用的相同代码截取屏幕截图。不幸的是,当我将相同的代码应用到包含一个对话框的游戏时,它甚至没有截取屏幕截图,也没有将其存储。相反,它会打开共享意图。
这是我到目前为止所做的。请告诉我问题出在哪里,或者给我一个如何解决这个问题的建议。
对话框代码
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: 打开失败:EACCES(权限被拒绝)07-24 18:06 :41.846: E/GREC(21546): 在 libcore.io.IoBridge.open(IoBridge.java:409) 07-24 18:06:41.846: E/GREC(21546): 在 java.io.FileOutputStream.(FileOutputStream.java:88) 07-24 18:06:41.846: E/GREC(21546): 在 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-24 18:06:41.846: E/GREC(21546): 在 java.lang.reflect.Method.invoke(Method.java:525) 07-24 18:06:41.846: E/GREC(21546): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 07-24 18:06:41.846: E/GREC(21546): 在 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:打开失败:EACCES(权限被拒绝) 07-24 18:06:41.846:E/GREC(21546):在 libcore.io.Posix.open(本机方法) 07-24 18:06:41.846: E/GREC(21546): 在 libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 07-24 18:06:41.846: E/GREC(21546): 在 libcore.io.IoBridge.open(IoBridge.java:393) 07-24 18:06:41.846: E/GREC(21546): ... 15 更多
【问题讨论】:
-
Bitmap bitmap = takeScreenShot(activity);。什么是activity? -
its not even taking the screenshot。那么你执行一些代码。它返回什么?出了什么问题?你记录一些东西。记录了什么? -
首先我删除最后一部分第二个
Bitmap bitmap = takeScreenShot(activity);活动是Activity activity = (MainActivity) this;,最后它甚至没有显示Log in Log cat而是在日志之后执行函数initshareIntent@greenapps跨度> -
我不明白你在说什么。
Bitmap bitmap = takeScreenShot(activity); Log.e("Screenshot", "taken successfully");。那是错误的编码。您首先应该检查位图是否==null。只有这样你才知道它是否被拿走了。如果 bitmapp== null 则不要继续,而是显示一个 Toast 说明。 ` -
它完美捕获,但在存储时我得到了异常检查我更新的问题以获取异常详细信息我知道它只是一团糟但请管理它@greenapps
标签: android dialog screenshot android-dialog