اسکرین شات گرفتن از لایه رلاتیو با عکس ها و متن های داخلش (((کمکککک))
سلام
من چند کد رو استفاده کردم ولی به نتیجه کلی نرسیدم
لطفا راهنمایی کنید . من الان در یک اکتیوتی یه دکمه قرار دادم .منظور در قسمت xml
و در این xml چند لایه قرار دادم که یکیش لایه رلاتیو هست که متن و عکس قرار داره داخل این لایه
حالا میخوام با زدن دکمه یه عکس از لایه رلاتیو گرفته شه و هم زمان هم ذخیره کنه عکس رو در حافظه و هم زمان به اشتراک هم بزاره . لطفا راهنمایی کنید .. خیلی با کد های تو سایت و جاهای دیگه سر و کله زدم ولی نتیجه ای نگرفتم

اول متد زیر رو بنویسید:
private Bitmap takeScreenShot(View view) {
view.setDrawingCacheEnabled(true);
view.invalidate();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
حالا اگه خواستید از کل صفحه اسکرین شات بگیرید باید متد بالا رو به این شکل صدا بزنید:
Bitmap bitmap = takeScreenShot(getWindow().getDecorView());
و اگه خواستید فقط از یه ویو مثل Button یا Relative Layout یا ... اسکرین شات بگیرید از کد زیر استفاده کنید:
ImageView img = (ImageView) findViewById(R.id.img);
Bitmap bitmap = takeScreenShot(img);
حالا اگه می خواید عکس گرفته شده رو توی یه ImageView نمایش بدید از کد زیر استفاده کنید:
img.setImageBitmap(bitmap);
حالا برای ذخیره کردن اول باید Bitmap که دارید رو با کد زیر به byte[] تبدیل کنید:
ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray();
برای ذخیره ی byte[] توی فایل:
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream("/storage/sdcard0/picture.png"); // البته مطمئن نیستم که فرمت png هست یا چیز دیگه خودتون تست کنید
outputStream.write(buffer, 0, buffer.length);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.flush();
}
catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
برای اشتراک گذاشتن هم توی Stackoverflow سرچ کنید.

فقط یه سوال برای کد زیر میخوام بگم وقتی اسکرین گرفت مثلا به انگلیش بنویسه shot.png و برای بار دوم که اسکرین گرفت بنویسه shot2.png یعنی اسکرین قبلی پاک نشه و بشه بجاب عدد حروف به اسکرین داد. ممنون میشم راهنمایی کنید .
public String SaveScreenshot(){
Random random = new Random();
String path = Environment.getExternalStorageDirectory().toString() + "/EidPics/";
File dir = new File(path);
if (!dir.exists())
dir.mkdirs();
Bitmap bitmap;
_root.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(_root.getDrawingCache());
_root.setDrawingCacheEnabled(false);
path += String.valueOf(random.nextInt(1000)) + ".png";
OutputStream fout = null;
File imageFile = new File(path);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fout);
fout.flush();
fout.close();
} catch (FileNotFoundException e) {
return null;
} catch (IOException e) {
return null;
}
return "file://" + imageFile.getAbsolutePath();
}
public void click (){
btshare.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String FileName = SaveScreenshot();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(FileName));
startActivity(Intent.createChooser(intent, getString(R.string.ShareBy)));
}
});
}

می تونید از کد زیر استفاده کنید که چک می کنه اگه وجود داشت یه شماره بعدش می نویسه:
File file = null;
for (int i = 0; i < 1000; i++) {
try {
file = new File("/storage/sdcard0/picture" + i + ".png");
if (file.exists()) {
continue;
} else {
break;
}
} catch (Exception e) {}
}
بعد از این حلقه متغیر file اسمی که وجود نداره رو در بر داره.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .