2016-07-08 6 views
1

사용자가 사진을 찍을 수있는 사진을 만들고 그 사진을 이미지 뷰에 저장하려고합니다. 나는 이것을 작동시키기 위해 수십 가지 방법을 시도했다.Android : 카메라로 사진을 찍고 전체 해상도 이미지를 imagview에 저장하려면 어떻게해야합니까?

내가 본 많은 답변들은 MediaStore 인 텐트를 사용하고 ACTION_CAMERA_CAPTURE를 전달할 때 data.getExtra ("data")를 사용하는 것이 좋습니다. 이렇게하면 더 작은 이미지가 반환되고 표시하려는 이미지가 커지므로이 방법을 사용하면 이미지가 흐리게 표시됩니다.

다른 옵션은이 동일한 방법을 사용하고 EXTRA_OUTPUT을 전달하는 것입니다. 그러나 이것은 저장 위치를 ​​넣어야하고 내가 본 모든 대답은 Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)를 넣으라고 알려줍니다. 그러나 onActivityResult에서 data.getData()를 수행하려고하면 null이 발생합니다. 어떻게해야합니까?

alert.setPositiveButton("Take Photo", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     profileFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "image_" + 
           String.valueOf(System.currentTimeMillis()) + ".jpg"); 

     profile = Uri.fromFile(profileFile); 
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         intent.putExtra(MediaStore.EXTRA_OUTPUT, profile); 


     startActivityForResult(intent, 1); 
    } 
}); 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == 1 && resultCode == RESULT_OK) { 

     ImageView imageView = (ImageView) findViewById(R.id.ProfileImage); 

     //This returns null. 
     //I am guessing that the Environment.getExternalSt...() method is getting a storage 
     //location that does not exist. 
     //I don't know what the correct storage location is and I have not 
     //been able to find it. 
     Uri u = data.getData(); 

     File finalFile = new File(getRealPathFromURI(u)); 

     Picasso.with(this).load(finalFile).into(imageView); 

    } 
} 

답변

0

은 내가 Environment.getExternalSt() 메소드가 존재하지 않는 저장 위치를 ​​점점 추측하고있다.

아마도 그렇지 않습니다. 그러나 귀하의 EXTRA_OUTPUT 값이 카메라 앱에 의해 귀하에게 반환되었다고 가정하고 있습니다. 이 문제가 발생했음을 나타내는 ACTION_IMAGE_CAPTURE 설명서에는 아무 것도 없습니다.

올바른 저장 위치가 무엇인지 알 수없고 찾을 수 없습니다.

이미지의 위치를 ​​알고 있습니다. EXTRA_OUTPUT에서 제공 한 위치에 있어야합니다. 그러니 그곳에 가서 이미지가 있는지 확인하십시오. 그러나 profileImage을 저장된 인스턴스 상태 Bundle에 넣고 있는지 확인하십시오. 카메라 응용 프로그램이 포 그라운드 상태 일 때 프로세스가 계속 실행될 것이라는 보장이 없기 때문입니다. 또한 많은 버그가있는 ACTION_IMAGE_CAPTURE 구현이 있으므로 이미지가 요청 된 위치에있을 것이라는 보장은 없습니다. 예를 들어

가 여기에 전체 해상도의 사진을 촬영할 수 ACTION_IMAGE_CAPTURE를 사용하는 활동이다, 다음 몇 가지 이미지 뷰어가 결과를 표시하도록 ACTION_VIEW을 사용

/*** 
Copyright (c) 2008-2016 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

From _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.camcon; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import java.io.File; 

public class CameraContentDemoActivity extends Activity { 
    private static final String EXTRA_FILENAME= 
    "com.commonsware.android.camcon.EXTRA_FILENAME"; 
    private static final String FILENAME="CameraContentDemo.jpeg"; 
    private static final int CONTENT_REQUEST=1337; 
    private File output=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (savedInstanceState==null) { 
     File dir= 
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 

     dir.mkdirs(); 
     output=new File(dir, FILENAME); 
    } 
    else { 
     output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME); 
    } 

    if (output.exists()) { 
     output.delete(); 
    } 

    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); 

    startActivityForResult(i, CONTENT_REQUEST); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putSerializable(EXTRA_FILENAME, output); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 

     i.setDataAndType(Uri.fromFile(output), "image/jpeg"); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
} 

이상

(this sample app에서) 장거리, 이것은 훌륭한 솔루션이 아닙니다. fileUri values are going away. official training pagethis revamped edition of my sample app은 대신 FileProvider을 사용하여 표시합니다.

+0

EXTRA_OUTPUT이 반환되지 않는다는 것은 무엇을 의미합니까? 이것이 틀렸다면 의도 데이터를 어떻게 얻을 수 있습니까? 또한 휴대 전화의 저장 위치를 ​​찾았지만 찾지 못했습니다. 내 컴퓨터에서 내 휴대 전화 저장소를보고 찾았습니다. 이것은 [link] (http://i.imgur.com/MgAYa9U.png) 위치입니다 (도움이 될지 모르겠 음). 대신 갤러리 위치에 저장할 수있는 방법을 알고 있습니까? [link] (http://i.imgur.com/GhdIWB8.png) – kindOfABigDeal

+0

실제로 얻으려는 폴더가 잘못되었습니다. 그것은 나에게이 위치/저장/에뮬레이션/0/Pictures/존재하지 않는 것을 제공합니다. 마지막 이미지에 그림 디렉토리가 있어야합니다. – kindOfABigDeal

+0

@kindOfABigDeal : "EXTRA_OUTPUT이 반환되지 않는다는 것은 무엇을 의미합니까?" - 당신이 'EXTRA_OUTPUT'에 넣은 값을 유지해야한다는 뜻입니다. 그 가치는'Intent' 결과에서 여러분에게 돌아 오지 않습니다."실제로 얻으려고하는 폴더가 잘못되었습니다."- [외부 저장소]에 대한 올바른 위치입니다 (https://commonsware.com/blog/2014/04/08/storage-situation-external- storage.html). – CommonsWare