마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

카메라로 찍은 사진을 서버에 옮기는 기본 어플인데 오류가 발생합니다.

0 추천
 

 package com.example.cjw72.server1;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private Button button;
    private String encoded_string, image_name;
    private Bitmap bitmap;
    private File file;
    private Uri file_uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.start);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view)
            {

                Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                getFileUri();
                i.putExtra(MediaStore.EXTRA_OUTPUT,file_uri);

                startActivityForResult(i,10);
            }
        });
    }

    private void getFileUri()
    {
        image_name = "testing123.jpg";

        file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ File.separator + image_name);
        file_uri = Uri.fromFile(file);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        Log.v("여기냐", "ㅁㅈㅇ");
        if(requestCode == 10 && resultCode == RESULT_OK)
        {

            new Encode_image().execute();
        }
    }
    private class Encode_image extends AsyncTask<Void,Void,Void>
    {
        protected  Void doInBackground(Void... voids)
        {
            bitmap = BitmapFactory.decodeFile(file_uri.getPath());
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);

            byte[] array = stream.toByteArray();
            encoded_string = Base64.encodeToString(array,0);
            return null;
        }
        protected  void onPostExecute(Void aVoid)
        {
            makeRequest();
        }
    }
    private void makeRequest()
    {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest request = new StringRequest(Request.Method.POST, "http://192.168.0.2/connection.php",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String,String> map = new HashMap<>();
                map.put("encoded_string", encoded_string);
                map.put("image_name", image_name);

                return map;
            }
        };
        requestQueue.add(request);
    }


}

 

어플을 실행하고 버튼을 누르면 어플이 죽습니다. 그래서 i.putchar(MediaStroe.EXTRA_OUTPUT, file_uri);를 주석처리하고 버튼을 누르면 카메라가 실행이 되긴하는데 오류의 원인을 찾기가 힘듭니다. 
cjw7242 (150 포인트) 님이 2018년 4월 1일 질문

1개의 답변

0 추천
 
채택된 답변
intent내 file uri가 외부로 노출될때 보안때문에 발생하는 exception이라고 하네요.

app의 AndroidManifest.xml에서 targetSdk 버전을 23이하로 설정하거나

FileProvide로 uri를 대체하는 구현사항이 추가로 필요합니다.

다음 링크 참고하세요.

http://gogorchg.tistory.com/entry/Android-FileProvider-androidosFileUriExposedException
디자이너정 (42,810 포인트) 님이 2018년 4월 1일 답변
cjw7242님이 2018년 4월 2일 채택됨
...