как запечатлеть экран телефона программно в андроиде

1

Я хочу знать, как программно отображать экран телефона. Я просто googled и узнал, что мне нужно использовать view.getDrawingCache(). Но getDrawingCache() всегда возвращает null.

Мой xml-макет

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/screenlayout">
<ImageView  
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@+id/screen"
/>
</LinearLayout>

java файл ::

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    View vScreen = findViewById(R.id.screenlayout);
    ImageView imageview = (ImageView)findViewById(R.id.screen);

    Bitmap bitmap;
    View v1 = vScreen.getRootView();
    v1.setDrawingCacheEnabled(true);
    bitmap = Bitmap.createBitmap(v1.getDrawingCache());   //getting null here     
    v1.setDrawingCacheEnabled(false)      
    imageview.setImageBitmap(bitmap);

}

Может кто-то, пожалуйста, поправьте меня, где я ошибаюсь?

  • 0
    Пожалуйста, посетите мой ответ
  • 0
    @ Люцифер: Я не хочу сохранять изображение на SD-карту. Спасибо за ответ.
Теги:
screen-capture

2 ответа

1

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


public class AndroidWebImage extends Activity {

ImageView bmImage; 
LinearLayout view;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      view = (LinearLayout)findViewById(R.id.screen);
      bmImage = (ImageView)findViewById(R.id.image);

      view.setDrawingCacheEnabled(true);
      // this is the important code :)  
      // Without it the view will have a dimension of 0,0 and the bitmap will be null          

      view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

      view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

      view.buildDrawingCache(true);
      Bitmap b = Bitmap.createBitmap(view.getDrawingCache());
      view.setDrawingCacheEnabled(false); // clear drawing cache

      bmImage.setImageBitmap(b);   

};


}

Присмотритесь, вы должны использовать:

 view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

 view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

Я использовал следующий файл main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
   android:id="@+id/screen"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/hello"
  />
<ImageView
  android:id="@+id/image"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
/>
</LinearLayout>

Результатом является:

Изображение 174551Ссылка

  • 0
    @Pavan сообщите мне, если это сработало для вас.
  • 0
    Я попробовал то, что ты предложил, но все равно не повезло. view.getDrawingCache () возвращает ноль.
Показать ещё 4 комментария
0

Все программы, которые позволяют скриншоты работать только на корневых телефонах? если ваш телефон является корневым, вы можете попробовать:

public class ScreenCapture extends Activity{

        LinearLayout view;

        @Override

        protected void onCreate(Bundle savedInstanceState) {

                // TODO Auto-generated method stub

                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);



                view = (LinearLayout)findViewById(R.id.screen);

                Button myBtn = (Button)findViewById(R.id.myBtn);



                myBtn.setOnClickListener(new View.OnClickListener(){

                        @Override

                        public void onClick(View v) {

                                // TODO Auto-generated method stub

                                View v1 = view.getRootView();

                                System.out.println("Root View : "+v1);

                                v1.setDrawingCacheEnabled(true);

                                Bitmap bm = v1.getDrawingCache();



                                System.out.println("Bitmap : "+bm);

                                showScreen(bm);

                        }

                });



        }

}

Вы также можете увидеть эту библиотеку: Android Screenshot Library (ASL) позволяет программно захватывать снимки экрана с устройств Android без необходимости иметь привилегии доступа root

  • 0
    Для захвата экрана вашего собственного приложения не требуется разрешение root, по крайней мере, я использую его для захвата экрана активности в нерутированном эмуляторе.
  • 0
    Когда я запускаю свое приложение, оно должно захватывать этот экран и показывать его. В верхней части я хочу отобразить другое изображение. Итак, каким должен быть вид (макет или вид изображения) в моем случае, поскольку ваш фрагмент кода показывает, что он записывается при нажатии кнопки?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню