Подтвердить что ты не робот

Android запускает программный снимок экрана

Во-первых, я пишу корневое приложение, поэтому root-разрешения не являются проблемой. Я искал и искал и нашел много кода, который никогда не работал у меня, вот что я собрал вместе до сих пор, и сортировка работает. Когда я говорю sorta, я имею в виду, что он делает изображение на моем /sdcard/test.png, однако файл имеет 0 байтов и, очевидно, не может быть просмотрен.

public class ScreenShot extends Activity{

View content;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blank);
    content = findViewById(R.id.blankview);
    getScreen();
}

private void getScreen(){
    Bitmap bitmap = content.getDrawingCache();
    File file = new File("/sdcard/test.png");
    try 
    {
        file.createNewFile();
        FileOutputStream ostream = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, ostream);
        ostream.close();
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}
}

Любая помощь в том, как я могу снять снимок экрана в android через код, будет очень благодарна вам!

=== РЕДАКТИРОВАТЬ ===

Следующее - это все, что я использую, изображение сделано на моей SD-карте и уже не является 0 байтами, но вся вещь черная, на ней ничего нет. Я привязал действие к моей кнопке поиска, поэтому, когда я нахожусь где-то на своем телефоне, я долгое время нажимаю на поиск, и он должен снимать снимок экрана, но я просто получаю черное изображение? Все настроено прозрачно, поэтому я думаю, что он должен захватить все, что есть на экране, но я просто становлюсь черным

манифеста

<activity android:name=".extras.ScreenShot"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:noHistory="true" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH_LONG_PRESS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    </activity>

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#00000000"
  android:id="@+id/screenRoot">    
</LinearLayout>

Класс скриншотов

public class ScreenShot extends Activity{

View content;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screenshot);
    content = findViewById(R.id.screenRoot);
    ViewTreeObserver vto = content.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        content.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        getScreen();
      }
    });
}

private void getScreen(){
    View view = content;
    View v = view.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap b = v.getDrawingCache();             
    String extr = Environment.getExternalStorageDirectory().toString();
    File myPath = new File(extr, "test.jpg");
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(myPath);
        b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
        MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen");
    }catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finish();
}
}
4b9b3361

Ответ 1

Здесь вы идете... Я использовал это:

View v = view.getRootView();
v.setDrawingCacheEnabled(true);
Bitmap b = v.getDrawingCache();
String extr = Environment.getExternalStorageDirectory().toString();
File myPath = new File(extr, getString(R.string.free_tiket)+".jpg");
FileOutputStream fos = null;
try {
    fos = new FileOutputStream(myPath);
    b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.flush();
    fos.close();
    MediaStore.Images.Media.insertImage( getContentResolver(), b, 
                                         "Screen", "screen");
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

v iz корневая компоновка... просто точка;)))

Ответ 2

Для следующего читателя этого вопроса -

Самый простой способ сделать это, нарисуя ваш взгляд на холст -

передать основную ссылку на этот метод -

 Bitmap file = save(layout);

 Bitmap save(View v)
   {
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    v.draw(c);
    return b;
   }

Ответ 3

Я думаю, вам нужно подождать, пока макет будет полностью нарисован. Используйте ViewTreeObserver, чтобы получить обратный вызов, когда макет полностью нарисован.

На вашем onCreate добавьте этот код... Только вызовите getScreen изнутри onGlobalLayout()..

ViewTreeObserver vto = content.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
  @Override
  public void onGlobalLayout() {
    content.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    getScreen();
  }
});

Я спросил несколько похожий question один раз... Пожалуйста, посмотрите мой вопрос, который объясняет, как сделать снимок экрана в android. Упование это помогает

Ответ 4

public class MainActivity extends Activity
{
Button btn;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            Bitmap bitmap = takeScreenshot();
            saveBitmap(bitmap);

        }
    });
}

public Bitmap takeScreenshot()
{
    View rootView = findViewById(android.R.id.content).getRootView();
    rootView.setDrawingCacheEnabled(true);
    return rootView.getDrawingCache();
}

public void saveBitmap(Bitmap bitmap)
{
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png");
    FileOutputStream fos;
    try
    {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    }
    catch (FileNotFoundException e)
    {
        Log.e("GREC", e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e("GREC", e.getMessage(), e);
    }
}
}

не забывайте давать разрешение на запись на внешнем хранилище!

Ответ 5

Вы снимаете скриншот Как это........

View view =  findViewById(R.id.rellayout);
        view.getRootView();
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) 
        {
            File picDir  = new File(Environment.getExternalStorageDirectory()+ "/name");
            if (!picDir.exists())
            {
                picDir.mkdir();
            }
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache(true);
            Bitmap bitmap = view.getDrawingCache();
//          Date date = new Date();
            String fileName = "mylove" + ".jpg";
            File picFile = new File(picDir + "/" + fileName);
            try 
            {
                picFile.createNewFile();
                FileOutputStream picOut = new FileOutputStream(picFile);
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));//Optional
                boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut);
                if (saved) 
                {
                    Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show();
                } else 
                {
                    //Error
                }
                picOut.close();
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
            view.destroyDrawingCache();
        } else {


        }

Ответ 6

Моя проблема была с "TargetApi (23)", которая необходима, если ваша minSdkVersion приведена ниже.

Итак, у меня есть разрешение на запрос со следующим фрагментом

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}