코딩하기/android studio

(android studio) 스크린샷 설정하기 (Screenshot)

치즈도넛 2021. 4. 2. 21:10
반응형

어플에 스크린샷 기능을 넣으려고 하니

제가 원하는 기능에 대한 정보가 많이 없더라고요

 

그래서 긁어모아 어떻게든 구현해보았습니다.

 

제가 원하는 기능은

버튼을 누르면 전체 스크린샷이 갤러리에 저장되는 것 입니다.

 


AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.xxxx.xxxxxxxxx">
    
    //갤러리에 들어가기 위해 필요한 부분
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    <application>
    ...
    </application>
</manifest>

우선 Manifest에 두줄을 추가해줍니다.

** 접근권한을 위해 꼭 필요한 부분입니다.

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    
     <ImageButton
            android:id="@+id/down"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:layout_marginBottom="30dp"
            android:onClick="ScreenshotButton"
            />
    
</LinearLayout>

xml에 버튼을 추가해 줍니다.

 

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

ImageButton down;

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
     // permission 부분(접근 권한)
     verifyStoragePermission(this);
     StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
     StrictMode.setVmPolicy(builder.build());
        
     down = findViewById(R.id.down);
   }
     
      public void ScreenshotButton(View view) {
       
        View rootView = getWindow().getDecorView();  //전체화면 부분

        File screenShot = ScreenShot(rootView);
        if (screenShot != null) {
            //갤러리에 추가합니다
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(screenShot)));
        }
        down.setVisibility(View.VISIBLE);
        Toast.makeText(getApplicationContext(),"갤러리에 저장되었습니다.",Toast.LENGTH_SHORT).show();
    }

    //화면 캡쳐하기
    public File ScreenShot(View view){
        down.setVisibility(View.INVISIBLE);
        
        view.setDrawingCacheEnabled(true);

        Bitmap screenBitmap = view.getDrawingCache(); //비트맵으로 변환

        String filename = "screenshot"+System.currentTimeMillis()+".png";
        File file = new File(Environment.getExternalStorageDirectory()+"/Pictures", filename);
        FileOutputStream os = null;
        try{
            os = new FileOutputStream(file);
            screenBitmap.compress(Bitmap.CompressFormat.PNG, 90, os); //비트맵 > PNG파일
            os.close();
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }

        view.setDrawingCacheEnabled(false);
        return file;
    }

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSION_STORAGE = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE
    };

    public static void verifyStoragePermission(Activity activity) {
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity,
                    PERMISSION_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);
        }
    }     
}

저는 캡쳐할 때 버튼이 보이는게 안예뻐서(?) setVisibility을 이용하였습니다.

캡쳐할 때는 버튼이 안보이게 했다가 > 저장이 끝난 뒤 버튼이 다시 보이도록 했습니다

 

 

 

 

이걸 활용한 어플을 만들었는데(안드로이드용)

 

냥술사 - 오늘의 해답/명언

play.google.com/store/apps/details?id=com.fortune.catfortuneteller

 

이 어플에는 추가로 랜덤으로 글 넣기 코드가 포함되어있습니다.

그 코드는 하단에 있는 글로 넘어가면 볼 수 있습니다.

2021.04.02 - [코딩하기/android studio] - (android studio) 랜덤으로 글 나오게 하기(random Text)

 

(android studio) 랜덤으로 글 나오게 하기(random Text)

뽑기처럼 랜덤으로 글이 나오도록 짜보고 싶어 서치하다 알아냈습니다 생각보다 어렵지 않더라고요. 우선 res > values > strings 에 들어갑니다. string.xml 안녕하세요 여기는 치즈도넛 블로그 입니다

cheese-donut.tistory.com

 

 


모두 즐겁게 코딩하세요~

반응형