android - take - screenshot app download




কিভাবে প্রোগ্রামারিকভাবে একটি স্ক্রিনশট নিতে? (17)

@ জাস্টিন মরিস উপরে এবং @ নিরভদঙ্গি এর উত্তরের উপর ভিত্তি করে https://stackoverflow.com/a/8504958/2232148 আমাদের অবশ্যই একটি দৃশ্যের ব্যাকগ্রাউন্ড এবং অগ্রভূমি নিতে হবে এবং এটিকে তাদের মতো একত্রিত করতে হবে:

public static Bitmap takeScreenshot(View view, Bitmap.Config quality) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), quality);
    Canvas canvas = new Canvas(bitmap);

    Drawable backgroundDrawable = view.getBackground();
    if (backgroundDrawable != null) {
        backgroundDrawable.draw(canvas);
    } else {
        canvas.drawColor(Color.WHITE);
    }
    view.draw(canvas);

    return bitmap;
}

গুণমানের প্যারামিটারটি Bitmap.Config.ARGB_8888Bitmap.Config.RGB_565 একটি ধ্রুবক নেয়, সাধারণত Bitmap.Config.ARGB_8888Bitmap.Config.RGB_565 বা Bitmap.Config.ARGB_8888Bitmap.Config.ARGB_8888

কোনও প্রোগ্রামের মাধ্যমে কিন্তু কোড থেকে কোনও ফোন-স্ক্রীনের নির্বাচিত এলাকাটির স্ক্রিনশট আমি কীভাবে নিতে পারি?


Mualig উত্তর খুব ভাল, কিন্তু আমি ইওক্কস একই সমস্যা ছিল, আমি ব্যাকগ্রাউন্ড পাচ্ছেন না। কখনও কখনও কখনও যথেষ্ট ভাল এবং কখনও কখনও আমি কালো পটভূমি উপর কালো টেক্সট (থিম উপর নির্ভর করে) পেতে।

এই সমাধানটি Mualig কোড এবং রোবোটিয়ামে পাওয়া কোডটিতে ব্যাপকভাবে ভিত্তিক। আমি ড্র পদ্ধতিতে সরাসরি কল করে ক্যাশে অঙ্কন ব্যবহার বাতিল করছি। এর আগে আমি পটভূমিটিকে বর্তমান ক্রিয়াকলাপ থেকে প্রথমে আঁকতে চেষ্টা করব।

// Some constants
final static String SCREENSHOTS_LOCATIONS = Environment.getExternalStorageDirectory().toString() + "/screenshots/";

// Get device dimmensions
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);

// Get root view
View view = mCurrentUrlMask.getRootView();

// Create the bitmap to use to draw the screenshot
final Bitmap bitmap = Bitmap.createBitmap(size.x, size.y, Bitmap.Config.ARGB_4444);
final Canvas canvas = new Canvas(bitmap);

// Get current theme to know which background to use
final Activity activity = getCurrentActivity();
final Theme theme = activity.getTheme();
final TypedArray ta = theme
    .obtainStyledAttributes(new int[] { android.R.attr.windowBackground });
final int res = ta.getResourceId(0, 0);
final Drawable background = activity.getResources().getDrawable(res);

// Draw background
background.draw(canvas);

// Draw views
view.draw(canvas);

// Save the screenshot to the file system
FileOutputStream fos = null;
try {
    final File sddir = new File(SCREENSHOTS_LOCATIONS);
    if (!sddir.exists()) {
        sddir.mkdirs();
    }
    fos = new FileOutputStream(SCREENSHOTS_LOCATIONS
            + System.currentTimeMillis() + ".jpg");
    if (fos != null) {
        if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos)) {
            Log.d(LOGTAG, "Compress/Write failed");
        }
        fos.flush();
        fos.close();
    }

} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

আপনি এই মত কিছু করার চেষ্টা করতে পারেন,

লেআউট বা setDrawingCacheEnabled থেকে বিটম্যাপ ক্যাশে পেতে কিছু ভালো করে দেখে নিন আপনাকে প্রথমে setDrawingCacheEnabled একটি বিন্যাসে (একটি লিনিয়ারআউটআউট অথবা রিলটিভেলআউট, অথবা একটি দৃশ্য)

তারপর

Bitmap bm = layout.getDrawingCache()

তারপর আপনি বিটম্যাপ দিয়ে যা চান তা করবেন। হয় এটি একটি ইমেজ ফাইল মধ্যে বাঁক, বা বিটম্যাপ এর uri অন্য কোথাও পাঠান।


আপনি নিম্নলিখিত লাইব্রেরিটি চেষ্টা করতে পারেন: http://code.google.com/p/android-screenshot-library/ Android স্ক্রিনশট লাইব্রেরী (এএসএল) রুট অ্যাক্সেস সুবিধা থাকার প্রয়োজন ছাড়াই Android ডিভাইস থেকে স্ক্রিনশটগুলি প্রোগ্রামে ক্যাপচার করতে সক্ষম করে। পরিবর্তে, ASL পটভূমিতে চলমান একটি নেটিভ পরিষেবা ব্যবহার করে, ডিভাইস বুট প্রতি একবার Android ডিবাগ সেতু (এডিবি) এর মাধ্যমে শুরু হয়।


আমি একটি সহজ লাইব্রেরি তৈরি করেছি যা একটি View থেকে একটি স্ক্রিনশট নেয় এবং এটি আপনাকে একটি বিটম্যাপ বস্তু দেয় বা আপনার যে কোনও পথে সরাসরি এটি সংরক্ষণ করে

https://github.com/abdallahalaraby/Blink


এই পদ্ধতিটি কল করুন, বাইরের সর্বাধিক ভিউগ্রুপে যা আপনি স্ক্রিন শট চান তা পাস করুন:

public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

এই প্রশ্নটির বেশিরভাগ উত্তর Canvas অঙ্কন পদ্ধতি বা অঙ্কন ক্যাশ পদ্ধতি ব্যবহার করে। যাইহোক, View.setDrawingCache() পদ্ধতি API 28View.setDrawingCache() । বর্তমানে স্ক্রীনশটগুলি তৈরির জন্য প্রস্তাবিত API টি API 24 থেকে উপলব্ধ PixelCopy শ্রেণি (তবে Window পরামিতি গ্রহণ করার পদ্ধতি API 26 == Android 8.0 ওরেও থেকে উপলব্ধ)। Bitmap পুনরুদ্ধারের জন্য এখানে নমুনা কোটলিন কোড রয়েছে:

@RequiresApi(Build.VERSION_CODES.O)
fun saveScreenshot(view: View) {
    val window = (view.context as Activity).window
    if (window != null) {
        val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
        val locationOfViewInWindow = IntArray(2)
        view.getLocationInWindow(locationOfViewInWindow)
        try {
            PixelCopy.request(window, Rect(locationOfViewInWindow[0], locationOfViewInWindow[1], locationOfViewInWindow[0] + view.width, locationOfViewInWindow[1] + view.height), bitmap, { copyResult ->
                if (copyResult == PixelCopy.SUCCESS) {
                    saveBitmap(bitmap)
                }
                // possible to handle other result codes ...
            }, Handler())
        } catch (e: IllegalArgumentException) {
            // PixelCopy may throw IllegalArgumentException, make sure to handle it
        }
    }
}

একটি রেফারেন্স হিসাবে, পর্দাটি ক্যাপচার করার এক উপায় (এবং শুধুমাত্র আপনার অ্যাপ্লিকেশন কার্যকলাপ নয়) ফ্রেমবফার (ডিভাইস / ডেভ / গ্রাফিক্স / Fb0) ক্যাপচার করা হয়। এটি করার জন্য আপনার অবশ্যই রুট বিশেষাধিকার থাকতে হবে অথবা আপনার অ্যাপ্লিকেশনটি স্বাক্ষর অনুমতিগুলির সাথে একটি অ্যাপ্লিকেশন হতে হবে ("অনুমতির জন্য আবেদনকারীর আবেদনকারীর একই শংসাপত্রের সাথে অনুরোধকারী অ্যাপ্লিকেশনটি সই হলেই কেবলমাত্র সিস্টেমটি অনুমোদিত হবে") - যা আপনি আপনার নিজের রম সংকলিত না হওয়া পর্যন্ত খুব সম্ভবত।

প্রতিটি ফ্রেমবফার ক্যাপচার, আমি পরীক্ষা করেছি কয়েকটি ডিভাইস থেকে, একটি স্ক্রিনশট রয়েছে। লোকেরা এটি ধারণ করার জন্য রিপোর্ট করেছে, আমি মনে করি এটি ফ্রেম / প্রদর্শন আকারের উপর নির্ভর করে।

আমি ক্রমাগত ফ্রেমবফারটি পড়ার চেষ্টা করেছি কিন্তু এটি একটি নির্দিষ্ট পরিমাণ বাইট পড়তে মনে হচ্ছে। আমার ক্ষেত্রে এটি (3 410 432) বাইট, যা 854 * 480 RGBA (3 279 360 বাইট) এর একটি প্রদর্শন ফ্রেম সংরক্ষণ করতে যথেষ্ট। হ্যাঁ, বাইনারিতে ফ্রেম, fb0 থেকে outputted আমার ডিভাইসে RGBA । এটি সম্ভবত ডিভাইস থেকে ডিভাইসের উপর নির্ভর করবে। এটি আপনার জন্য decoding এটি গুরুত্বপূর্ণ হবে =)

আমার ডিভাইসে / dev / graphics / fb0 অনুমতিগুলি যাতে শুধুমাত্র গ্রাফিক্স থেকে রুট এবং ব্যবহারকারীরা fb0 পড়তে পারে।

গ্রাফিক্স একটি বিধিনিষেধযুক্ত গ্রুপ তাই আপনি সম্ভবত su কমান্ড ব্যবহার করে rooted ফোন দিয়ে fb0 অ্যাক্সেস করতে পারবেন।

Android অ্যাপগুলিতে ব্যবহারকারী আইডি (uid) = app _ ## এবং গোষ্ঠী আইডি (guid) = app _ ## রয়েছে

adb shell এর uid = shell এবং guid = shell , যার একটি অ্যাপের চেয়ে অনেক বেশি অনুমতি রয়েছে। আপনি প্রকৃতপক্ষে /system/permissions/platform.xml এ অনুমতিগুলি পরীক্ষা করতে পারেন

এর অর্থ হল আপনি রুট ছাড়া অ্যাডব শেল এ fb0 পড়তে সক্ষম হবেন তবে আপনি রুট ছাড়া অ্যাপের মধ্যে এটি পড়বেন না।

এছাড়াও, AndroidManifest.xml এ READ_FRAME_BUFFER এবং / অথবা ACCESS_SURFACE_FLINGER অনুমতিগুলি নিয়মিত অ্যাপ্লিকেশনের জন্য কিছুই করবে না কারণ এটি কেবল ' স্বাক্ষর ' অ্যাপ্লিকেশনের জন্য কাজ করবে।

এছাড়াও আরো বিস্তারিত জানার জন্য এই বন্ধ থ্রেড চেক।


পরামিতি দেখুন রুট বিন্যাস বস্তু।

public static Bitmap screenShot(View view) {
                    Bitmap bitmap = null;
                    if (view.getWidth() > 0 && view.getHeight() > 0) {
                        bitmap = Bitmap.createBitmap(view.getWidth(),
                                view.getHeight(), Bitmap.Config.ARGB_8888);
                        Canvas canvas = new Canvas(bitmap);
                        view.draw(canvas);
                    }
                    return bitmap;
                }

যদি আপনি ফগমেন্ট থেকে স্ক্রিনশট নিতে চান তবে এটি অনুসরণ করুন:

  1. onCreateView() :

             @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                // Inflate the layout for this fragment
                View view = inflater.inflate(R.layout.fragment_one, container, false);
                mView = view;
            }
  2. স্ক্রিনশট গ্রহণের জন্য যুক্তিযুক্ত:

     button.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         View view =  mView.findViewById(R.id.scrollView1);
          shareScreenShotM(view, (NestedScrollView) view); 
     }
  3. পদ্ধতি shareScreenShotM)() :

    public void shareScreenShotM(View view, NestedScrollView scrollView){
    
         bm = takeScreenShot(view,scrollView);  //method to take screenshot
        File file = savePic(bm);  // method to save screenshot in phone.
        }
  4. পদ্ধতি নিতে স্ক্রিনশট ():

             public Bitmap takeScreenShot(View u, NestedScrollView z){
    
                u.setDrawingCacheEnabled(true);
                int totalHeight = z.getChildAt(0).getHeight();
                int totalWidth = z.getChildAt(0).getWidth();
    
                Log.d("yoheight",""+ totalHeight);
                Log.d("yowidth",""+ totalWidth);
                u.layout(0, 0, totalWidth, totalHeight);
                u.buildDrawingCache();
                Bitmap b = Bitmap.createBitmap(u.getDrawingCache());
                u.setDrawingCacheEnabled(false);
                u.destroyDrawingCache();
                 return b;
            }
  5. পদ্ধতি সংরক্ষণ করুন ():

     public static File savePic(Bitmap bm){
    
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
             File sdCardDirectory =  new File(Environment.getExternalStorageDirectory() + "/Foldername");
    
           if (!sdCardDirectory.exists()) {
                sdCardDirectory.mkdirs();
          }
           //  File file = new File(dir, fileName);
          try {
             file = new File(sdCardDirectory, Calendar.getInstance()
                .getTimeInMillis() + ".jpg");
            file.createNewFile();
            new FileOutputStream(file).write(bytes.toByteArray());
            Log.d("Fabsolute", "File Saved::--->" + file.getAbsolutePath());
             Log.d("Sabsolute", "File Saved::--->" + sdCardDirectory.getAbsolutePath());
         } catch (IOException e) {
              e.printStackTrace();
          }
         return file;
       }

কার্যকলাপের জন্য আপনি কেবল ব্যবহার করতে পারেন View v1 = getWindow().getDecorView().getRootView(); পরিবর্তে mView


যারা একটি GLSurfaceView ক্যাপচার করতে চান, getDrawingCache বা ক্যানভাস পদ্ধতিতে অঙ্কন কাজ করবে না।

ফ্রেম রেন্ডার করার পরে আপনাকে OpenGL ফ্রেমবফারের সামগ্রী পড়তে হবে। এখানে একটি ভাল উত্তর here


শুধু taraloca এর উত্তর প্রসারিত। আপনি এটি কাজ করতে অনুসরণ লাইন যোগ করা আবশ্যক। আমি ইমেজ নাম স্ট্যাটিক তৈরি করেছেন। আপনি taraloca টাইমস্ট্যাম্প পরিবর্তনশীল incase আপনি গতিশীল ইমেজ নাম প্রয়োজন প্রয়োজন দয়া করে নিশ্চিত করুন।

    // Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

private void verifyStoragePermissions() {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
    }else{
        takeScreenshot();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        if (requestCode == REQUEST_EXTERNAL_STORAGE) {
            takeScreenshot();
        }
    }
}

এবং AndroidManifest.xml ফাইলের মধ্যে নিম্নলিখিত এন্ট্রি অবশ্যই আবশ্যক:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

স্ক্রিনশট ক্যাপচার করার পাশাপাশি আমরা যদি টোনটি খেলতে চাই তবে আমরা নিম্নলিখিত কোডটি ব্যবহার করতে পারি

    MediaPlayer _shootMP = null;
    AudioManager manager = (AudioManager) 
    getActivity().getSystemService(Context.AUDIO_SERVICE);
    manager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, 
    manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
    if (_shootMP == null)
        _shootMP = MediaPlayer
                .create(getActivity(),
                        Uri.parse("file:///system/media/audio/ui/camera_click.ogg"));
    if (_shootMP != null) {
        try {

            _shootMP.start();
            _shootMP.setOnCompletionListener(new OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer arg0) {
                    // release the media
                    _shootMP.stop();
                    _shootMP.reset();
                    _shootMP.release();
                    _shootMP = null;

                }
            });
        } catch (IllegalStateException e) {
            Log.w(TAG, "Exception takeScreenShot" + e.getMessage());

        }
    }

সম্পাদনা করুন: ডাউনভোটস সঙ্গে রহমত আছে। ২010 সালে যখন আমি এই প্রশ্নের উত্তর দিলাম তখন এটা সত্য ছিল।

স্ক্রিনশট শুধুমাত্র রুট ফোন কাজ করে যা সব প্রোগ্রাম।


শুধুমাত্র সিস্টেম অ্যাপ্লিকেশন জন্য!

Process process;
process = Runtime.getRuntime().exec("screencap -p " + outputPath);
process.waitFor();

দ্রষ্টব্য: এই কমান্ড চালানোর জন্য সিস্টেম অ্যাপ্লিকেশনগুলিকে "su" চালানোর দরকার নেই।


সম্পূর্ণ পৃষ্ঠা স্ক্রোলিং স্ক্রিনশট জন্য

আপনি যদি একটি পূর্ণ দৃশ্য স্ক্রিনশটটি ক্যাপচার করতে চান (যার মধ্যে একটি স্ক্রলভিউ রয়েছে বা তাই) তাহলে এই লাইব্রেরিতে একটি চেক করুন

https://github.com/peter1492/LongScreenshot

আপনাকে যা করতে হবে তা গ্র্যাডাল আমদানি করুন এবং BigScreenshot এর একটি বস্তু তৈরি করুন

BigScreenshot longScreenshot = new BigScreenshot(this, x, y);

স্ক্রিন ভিউ গ্রুপের মাধ্যমে স্বয়ংক্রিয়ভাবে স্ক্রোল করার সময় এবং শেষে শেষে একত্রিত হওয়া স্ক্রিনশটগুলির বিটম্যাপ সহ একটি কলব্যাক গ্রহণ করা হবে।

@Override public void getScreenshot(Bitmap bitmap) {}

যা গ্যালারি সংরক্ষণ করা যেতে পারে বা যা ব্যবহার করা প্রয়োজন তাদের পরে


public class ScreenShotActivity extends Activity{

private RelativeLayout relativeLayout;
private Bitmap myBitmap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    relativeLayout = (RelativeLayout)findViewById(R.id.relative1);
    relativeLayout.post(new Runnable() {
        public void run() {

            //take screenshot
            myBitmap = captureScreen(relativeLayout);

            Toast.makeText(getApplicationContext(), "Screenshot captured..!", Toast.LENGTH_LONG).show();

            try {
                if(myBitmap!=null){
                    //save image to SD card
                    saveImage(myBitmap);
                }
                Toast.makeText(getApplicationContext(), "Screenshot saved..!", Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });

}

public static Bitmap captureScreen(View v) {

    Bitmap screenshot = null;
    try {

        if(v!=null) {

            screenshot = Bitmap.createBitmap(v.getMeasuredWidth(),v.getMeasuredHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(screenshot);
            v.draw(canvas);
        }

    }catch (Exception e){
        Log.d("ScreenShotActivity", "Failed to capture screenshot because:" + e.getMessage());
    }

    return screenshot;
}

public static void saveImage(Bitmap bitmap) throws IOException{

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes);
    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.png");
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
    fo.close();
}

}

অনুমতি যোগ করুন

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>




screenshot