آموزش گرفتن Screenshot در برنامه نویسی اندروید
سلام دوستان امیدوارم حالتون خوب باشه در این سری از آموزش برنامه نویسی اندروید به آموزش گرفتن Screenshot در برنامه نویسی اندروید می پردازیم. ما برای این کار از کتاب خانه ای استفاده نکردیم اکثر کتاب خانه ها حدودا یم مگ حجم دارند البته امکانات بیشتر دارند ولی تا جایی که امکان داشته ما همان امکانات را در کد زیر پیاده سازی کردیم با ما همراه باشید.
قبل از هر کار ابتدا باید دسترسی استفاده از حافظه خارجی را در AndroidManifest.xml قرار دهیم.
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
در اکتیویتی که می خواهید از صفحه عکس (screenshot) بگیرید void زیر را قرار دهید در ادامه آن را توضیح خواهیم داد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private void takeScreenshot() { Date now = new Date(); android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); try { String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg"; // create bitmap screen capture View v1 = getWindow().getDecorView().getRootView(); v1.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); File imageFile = new File(mPath); FileOutputStream outputStream = new FileOutputStream(imageFile); int quality = 100; bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); outputStream.flush(); outputStream.close(); } catch (Throwable e) { // Several error may come out with file handling or OOM e.printStackTrace(); } } |
و برای اجرا آن هم باید همان void را اجرا کنید به شکل زیر
1 | takeScreenshot(); |
در ابتدا ما از Date یک instance (مثال) جدید ساختیم سپس در خط بعد از آن آمده ایم تاریخ و ساعت را گرفته ایم (به طور دقیق تر سال , ماه , روز , ساعت , دقیقه و ثانیه را به دست آورده در متغیر now قرار میدهیم) ما از آن به عنوان اسم عکس خود استفاده خواهیم کرد بعد از مسیر حافظه خارجی را به دست آورده بعلاوه متغیر now کرده به علاوه نوع فایل ما که از نوع jpg است (مسیر فایل ما بعلاوه اسم آن در متغیر mPath قرار می گیرد.)
حالا باید صفحه که می خواهیم ازش عکس بگیریم را آماده کنیم به خط زیر نگاه کنید .
1 | View v1 = getWindow().getDecorView().getRootView(); |
چون ما در اکتیویتی هستیم از کد بالا استفاده شده است اما اگر خواستید در فرگمنت عکس بگیرید باید کد بالا رو به شکل زیر تغییر دهید.
1 | View v1 = getActivity().getWindow().getDecorView().getRootView(); |
برگردیم به ادامه کار بعد از آن باید کش را فعال کنیم تا عکس در کش (cache) قرار گیرد سپس از آن عکس خود را بسازیم و سپس دوباره کش را میبندیم. تا اینجا ما فقط یک فایل bitmap داریم که عکس در آن است حال باید فایل عکس را درست کنیم و عکس را در آن قرار دهیم یک instance از File درست کرده و با استفاده از FileOutputStream عکس را در فایل قرار می دهیم در اینجا ما می توانیم بروی quality عکس نیز دسترسی داشته باشیم 100 به معنی با بالاترین کیفیت است اگر بخواهید حجم آن را کم کنید می توانید مقدار آن را تغییر بدهید ولی ممکن است عکس بی کیفیت شود.
ما در اینجا آن عکس رو فشرده هم کرده ایم با استفاده از متود compress خود bitmap سپس آن را بسته و کار را تمام می کنیم.
این آموزش هم به پایان رسید.
موفق باشید.
سلام takeScreenshot();این رو کجا باید وارد کنیم ارور میده
در بخش اکتیویتی که می خواهید عکس از صفحه گرفته بشه
مثل زیر
http://s8.picofile.com/file/8300332542/Untitled.png
یک ارور دیگه هم هست نمیدونم چیه
دوست عزیز void را باید قبل از بسته شدن اخرین اکولاد قرار دهید
ممنون این همه زود جواب دادین من تازه 10 روزه شروع کردم خیلی سخته.اون جایی که گفتین قرار دادم باز نشد من عینا کدهاتون رو کپی میکنم نه چیزی کم میکنم نه زیاد
http://s8.picofile.com/file/8300335368/Untitled.png
خواهش می کنم گفتم اشباه قرار داده اید مثل زیر قرار بدیدش
خیلی ممنون روی اندروید کیت کت چیزی اسکرین نکرد.روتم هست قبلا شنیدم روت نباشه این کدا کار نمیکنن ولی این گوشی روت بود تست زدم
سلام کد قبل از قرار دادن در سایت بروی چند شبیه ساز تست می شود و نیازی به روت هم نیست البته گوشی با اندروید 3.2 به پایین این امکان براش وجود نداره تمامی بخش ها را تست کنید در صورتی که کار نکرد بخش log را قرار دهید تا بررسی کنیم.
من روی nox الان تست زدم .توی کدوم پوشه سیو میکنه میخواین فیلم بگیرم اگه زحمتی نیست ببینین
علت ذخیره نشدن اینه که این به صورت پیشفرض فایل رو در sd کار ذخیره می کنه شما باید بخش زیر را تغییر دهید تا در حافظه خود گوشی ذخیره شود.
به خط زیر تغییر دهید.
موفق باشید.
متاسفانه نمیشه بی زحمت فیلم رو ببینین
http://s8.picofile.com/file/8300370084/2017_07_13_0_14_38.rar.html
سلام شما درست اشاره کردید مثل اینکه در بعضی از گوشی های اسکرین شات گرفته نمیشه من به زودی یک آموزش جدید برای گرفتن Screen shot آماده می کنم و زیر همین پست لینک آن را قرار میدهم موفق باشید.
ممنون از آموزش مفيدتون
مشكل من اينجاست كه اين كدها ويوو اكتيويتي رو ذخيره ميكنه و با صفحه نمايش گوشي كاري نداره
من ميخوام از صفحه نمايش عكس بگيرم نه از ويوو اكتيويتي
و كد رو تو يه سرويس بنويسم
لطفا اگه زحمتي نيست راهنمايي كنيد، ممنون ميشم.
سلام
لینک زیر را بررسی کنید.
http://programchi.ir/?s=%D8%B9%DA%A9%D8%B3+%DA%AF%D8%B1%D9%81%D8%AA%D9%86
موفق باشید.
سلام و عرض ادب
واقعا خسته نباشید . میخاستم بدونم با سرویس پس زمینه چظور میشه از صفحه گوشی اسکرین گرفت . تابع getWindow() در سرویس شناخته نمیشه . لطفا راهنماییم کنین . ممنون
سلام و دورد
از لینک زیر استفاده کنید.
https://github.com/commonsguy/cw-omnibus/tree/v8.5/MediaProjection/andshooter
موفق باشید.
این کد رو من پیدا کردم و کاملا درست کار کرد
فقط باید علاوه بر این دوتا :
این کد رو هم در OnCreate قرار بدید
سلام من میخوام جلوی گرفتن اسکرین شات رو بگیرم و نزارم کاربر از محیط اپلیکیشن عکس بگیره
یه جوری مسدود کنم. کدشو میدونین؟
ایمیل من alinumberzf@gmail.com
سلام اگر بخواهیم یک بخشی از اون اکتیویتی اسکرین شات بشه باید چکار کنیم راهی داره
سلام و درود
از کشل بگیرید بعدش crop کنید
خیلی ممنون
کد رو که نوشتم عکس رو تو ریشه حافظه تلفن ذخیره میکنه چجوری میتونم مسیرش رو عوض کنم که تو پوشه خاصی ذخیره بکنه عکس رو
سلام
عکس توی حافظه گوشی ذخیره می شه می تونیم کاری کنیم که تو یک پوشه خاص ذخیره بشه یعنی یک پوشه بسازه و عکس ها رو داخل اون بریزه
یک لیوت دارم که از موارد زیر تشکیل شده
بعضی مواقع لیست ویو مربوط به آن زیاد میشه مثلا تا 15 ردیف که در لیست ویو هست فقط 10 تاش را در صفحه نمایش گوشی نمایش میده باید چکار کنم بتونم به صورت کامل از لیست ویو و کل لیوت اسکرین شات بگیرم
]]>
این لیوت من از یک LinearLayout کلی تشکیل شده سپس از یک اسکرول ویو و باقی موارد در LinearLayout های جداگانه درون اسکرول ویو قرار دارد
کدی که اموزش دادید فقط از صفحه گوشی عکس میگیره و نمیتونه از کل LinearLayout اول که همه عناصر دیگه درون اون قرار داره عکس بگیره
لیوت من در ادرس زیر هست:
http://s6.picofile.com/file/8375759834/content_image.rar.html
سلام
ایا هیچ راهنمایی برای این موضوع ندارید؟
این کد رو توی بردکست رسیور قرار بدیم به این خط کد ارور میده باید چه کارش کنیم
View v1 =getWindow().getDecorView().getRootView();