반응형
어플에 스크린샷 기능을 넣으려고 하니
제가 원하는 기능에 대한 정보가 많이 없더라고요
그래서 긁어모아 어떻게든 구현해보았습니다.
제가 원하는 기능은
버튼을 누르면 전체 스크린샷이 갤러리에 저장되는 것 입니다.
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' 카테고리의 다른 글
(android studio) 구글 콘솔 Mapping 파일 업로드(ReTrace 매핑 파일, mapping.txt) (0) | 2021.04.03 |
---|---|
(android studio) Splash 화면 만들기 - gif 이미지 사용 (1) | 2021.04.03 |
(android studio) 랜덤으로 글 나오게 하기(random Text) (0) | 2021.04.02 |
(android studio) TextView - 자간, 장평, 행간 (0) | 2021.04.02 |
(android studio) SimpleDateFormat 현재시간 값 구하고 setText하기 (0) | 2021.04.02 |
댓글