如何以编程方式保存屏幕截图而不覆盖之前截取的屏幕截图?
How can I save a screenshots programmatically with out over writing the previously taken screenshot?
我正在开发一个 android 应用程序,我想保存该应用程序的屏幕截图。我可以保存单个屏幕截图,但它会覆盖之前的屏幕截图。
我按照教程进行了修改,但只需要一张截图
附上按钮动作中的代码
case R.id.btn_save:
View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
Bitmap bitmap = getScreenShot(rootView);
int i = 0;
File file = new File("ScreenShot"+ i +".PNG");
if(!file.exists()){
store(bitmap, "ScreenShot"+ i +".PNG");
}
else {
store(bitmap, "ScreenShot"+ i++ +".PNG");
}
和截图存储功能
public void store(Bitmap bm, String fileName){
String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";
File dir = new File(dirPath);
if (!dir.exists()){
dir.mkdirs();
}
File file = new File(dirPath,fileName);
try{
FileOutputStream fos = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100,fos);
fos.flush();
fos.close();
}catch (Exception e){
e.printStackTrace();
Toast.makeText(this, "Error saving File", Toast.LENGTH_SHORT).show();
}
}
因为在该代码中,文件名始终相同 - i 始终为 0。为了使其适用于应用程序的一次使用,i 应该是一个成员变量并递增每个屏幕截图。为了使其更普遍地工作,您应该使用 File.createTempFile()
生成一个随机名称
您在保存按钮内声明了 i 变量,因此单击按钮时您将始终从 0 开始。要使用您尝试的方式,您应该在该范围之外声明该变量,但是当您终止并重新打开应用程序时它将重新启动。
如果您想使用该方法,您可以使用“共享首选项”保存以下号码以供使用(或上次使用)。如果没有,您可以简单地使用
"Screenshot" + System.currentTimeInMillis().toString().
您还会看到截图的时间(虽然以毫秒为单位)。如果您愿意,可以将其格式化为 "user readable" 20191110 例如
case R.id.btn_save:
View rootView getWindow().getDecorView().findViewById(android.R.id.content);
Bitmap bitmap = getScreenShot(rootView);
File dir = new File(Environment.getExternalStorageDirectory(), "Screenshots");
if (!dir.exists())
if ( !dir.mkdirs())
{
Toast ( could not create dir...);
return;
}
int i = 0;
while (++i > 0 )
{
String fileName = "ScreenShot"+ i +".png";
File file = new File(dir, fileName);
if(!file.exists())
{
store(bitmap, file);
break;
}
}
break;
将store(Bitmap bm, String fileName)
的参数改为store(Bitmap bm, File file)
在那里你可以删除 try 块之前的所有代码。
我正在开发一个 android 应用程序,我想保存该应用程序的屏幕截图。我可以保存单个屏幕截图,但它会覆盖之前的屏幕截图。 我按照教程进行了修改,但只需要一张截图
附上按钮动作中的代码
case R.id.btn_save:
View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
Bitmap bitmap = getScreenShot(rootView);
int i = 0;
File file = new File("ScreenShot"+ i +".PNG");
if(!file.exists()){
store(bitmap, "ScreenShot"+ i +".PNG");
}
else {
store(bitmap, "ScreenShot"+ i++ +".PNG");
}
和截图存储功能
public void store(Bitmap bm, String fileName){
String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";
File dir = new File(dirPath);
if (!dir.exists()){
dir.mkdirs();
}
File file = new File(dirPath,fileName);
try{
FileOutputStream fos = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100,fos);
fos.flush();
fos.close();
}catch (Exception e){
e.printStackTrace();
Toast.makeText(this, "Error saving File", Toast.LENGTH_SHORT).show();
}
}
因为在该代码中,文件名始终相同 - i 始终为 0。为了使其适用于应用程序的一次使用,i 应该是一个成员变量并递增每个屏幕截图。为了使其更普遍地工作,您应该使用 File.createTempFile()
生成一个随机名称您在保存按钮内声明了 i 变量,因此单击按钮时您将始终从 0 开始。要使用您尝试的方式,您应该在该范围之外声明该变量,但是当您终止并重新打开应用程序时它将重新启动。
如果您想使用该方法,您可以使用“共享首选项”保存以下号码以供使用(或上次使用)。如果没有,您可以简单地使用
"Screenshot" + System.currentTimeInMillis().toString().
您还会看到截图的时间(虽然以毫秒为单位)。如果您愿意,可以将其格式化为 "user readable" 20191110 例如
case R.id.btn_save:
View rootView getWindow().getDecorView().findViewById(android.R.id.content);
Bitmap bitmap = getScreenShot(rootView);
File dir = new File(Environment.getExternalStorageDirectory(), "Screenshots");
if (!dir.exists())
if ( !dir.mkdirs())
{
Toast ( could not create dir...);
return;
}
int i = 0;
while (++i > 0 )
{
String fileName = "ScreenShot"+ i +".png";
File file = new File(dir, fileName);
if(!file.exists())
{
store(bitmap, file);
break;
}
}
break;
将store(Bitmap bm, String fileName)
的参数改为store(Bitmap bm, File file)
在那里你可以删除 try 块之前的所有代码。