1. 준비물 

Bitmap을 이용할 것입니다. 그러므로 Bitmap관련 모듈들을 import하고 getBitmapFromUri를 새로 만듭니다.


1
2
3
4
5
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;  
      private Bitmap getBitmapFromUri(Uri uri) throws IOException {
    }
cs


그 다음에 FileDescriptor를 import 하고 새로 FileDescriptor를 써 줍니다.


1
2
3
4
5
6
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
        ParcelFileDescriptor parcelFileDescriptor =
                getActivity().getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
cs


2. 비트맵 파일 편집


파일을 가져온 다음엔 BitmapFactory를 이용해서 세부 옵션을 설정합니다.


        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFileDescriptor(fileDescriptor, null, opts);
cs


옵션은 따로 정해줄 수 있습니다.


        int width = opts.outWidth;
        int height = opts.outHeight;
 
        float sampleRatio = getSampleRatio(width, height);
 
        opts.inJustDecodeBounds = false;
        opts.inSampleSize = (int) sampleRatio;
 
cs


그 후에 Bitmap 스트림을 닫아줍니다.


        Bitmap resizedBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor, null, opts);
        Log.d("Resizing", "Resized Width / Height : " + resizedBitmap.getWidth() + "/" + resizedBitmap.getHeight());
        parcelFileDescriptor.close();
        return resizedBitmap;
cs


3. 이미지 파일에 부여될 텍스트 편집

Bitmap으로 불러온 파일에 이름을 지정할 것이므로 아래의 코드를 activity에서 원하는 자리에 위치시킵니다. 부모레이아웃과 자식레이아웃을 설정해서 작업해봤습니다.


    public void onAddField(View v) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View rowView = inflater.inflate(R.layout.field, null);
        parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount());
        int count = parentLinearLayout.getChildCount();
        TextView result_field = findViewById(R.id.result);
        result_field.setText(Integer.toString((count-1)));
        View view = parentLinearLayout.getChildAt(count-1);
        if(view instanceof EditText){
            EditText last = (EditText)view;
            last.setSelection(0);
        }
    }
cs


그 다음 이름을 사용자로부터 받은 후 등록여부를 재차 확인하는 버튼을 구현합니다.


    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("You can Save your title");
        builder.setMessage("re-check your message?");
        builder.setPositiveButton("Enter"new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                finish();
            }
        });
        builder.setNegativeButton("Deny"new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }
}
cs


이렇게 긍정 버튼과 부정 버튼을 설정했습니다. 사용자가 Enter와 Deny 둘 중 하나를 선택하여 이름을 지정할 수 있습니다.

+ Recent posts