1

저는 애플리케이션을 개발 중이며 그 중 일부로 카메라에서 캡처 한 후나 갤러리에서 이미지를 자른 후 이미지를 자르도록해야합니다. 내 앱에 탐색 서랍이 있고 사용자가 이미지 (카메라 또는 갤러리)를 볼 수있는 옵션을 선택할 수 있습니다. 옵션 중 하나를 클릭 할 때마다 나머지 부분이 호출되는 단편이 호출됩니다 (카메라 호출, 그림 클릭, 데이터 가져 오기 및 이미지 뷰 설정). 자 이제 이미지의 자르기 기능을 추가해야하고 here이라는 온라인에서 제공되는 자르기 라이브러리 중 하나를 사용했습니다. 내 애플 리케이션에서 그것을 시도하기 전에, 나는 새로운 안드로이드 스튜디오 프로젝트를 만들고 사용자가 버튼을 클릭하여 자르기가 완료되고 자른 이미지가 화면의 이미지 뷰로 설정되어있는 카메라를 선택할 수있는 샘플 애플 리케이션을 만들었습니다. 프로젝트는 here입니다. 자, 내 애플 리케이션에서 동일한 구현하려고하지만 작동하지 않습니다. 코드에 오면 탐색 용 서랍 클래스와 조각 클래스가 있습니다. 내 MainDrawerActivity에서 (간단한) : 메뉴 옵션에서Android : 갤러리에서 캡처 또는 선택 후 이미지 자르기

:

if (id == R.id.nav_camera) { 
     Fragment_TouchImageView camFrag = (Fragment_TouchImageView) getSupportFragmentManager().findFragmentById(R.id.imageFragment); 
     camFrag.startCamera(); 
    } 
else if (id == R.id.nav_gallery) { 
     Fragment_TouchImageView galFrag = (Fragment_TouchImageView) getSupportFragmentManager().findFragmentById(R.id.imageFragment); 
     galFrag.openGallery(); 
    } 

이제 내 Fragment_TouchImageView.java에서 (조각) :

package com.example.shravan.watershed; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import com.soundcloud.android.crop.Crop; 

import java.io.File; 

public class Fragment_TouchImageView extends Fragment { 

Uri imageUri; 
private TouchImageView myTVF; 
static final int REQUEST_IMAGE_CAPTURE = 10; 
static final int PICK_IMAGE = 100; 
private static Context context; 
private static final String TAG = "Arunachala"; 

public Fragment_TouchImageView() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_fragment__touch_image_view, container, false); 
    context= getActivity().getApplicationContext(); 
    myTVF = (TouchImageView) v.findViewById(R.id.img); 
    myTVF.setImageBitmap(null); 
    return v; 
} 

public void startCamera() { 
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i, REQUEST_IMAGE_CAPTURE); 
} 

public void openGallery() { 
    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
    startActivityForResult(gallery, PICK_IMAGE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { 
     print("Camera requested"); 
     beginCrop(data.getData()); 
     print("Crop called and came to next line"); 
    } 
    else if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK)   { 
     print("Gallery requested"); 
     beginCrop(data.getData()); 
     print("Crop called and came to next line"); 
    } 
    else if (requestCode == Crop.REQUEST_CROP) { 
     print("Crop.REQUEST_CROP called"); 
     handleCrop(resultCode, data); 
     print("handleCrop called and came to next line"); 
    } 
} 

private void beginCrop(Uri source) { 
    print("Crop has begun"); 
    Uri destination = Uri.fromFile(new File(context.getCacheDir(), "cropped")); 
    Crop.of(source, destination).asSquare().start(getActivity()); 
    print("Crop has ended"); 
} 

private void handleCrop(int resultCode, Intent result) { 
    print("Came to handleCrop"); 
    if (resultCode == Activity.RESULT_OK) { 
     print("RESULT OK"); 
     myTVF.setImageURI(Crop.getOutput(result)); 
    } else if (resultCode == Crop.RESULT_ERROR) { 
     Toast.makeText(getActivity(), Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show(); 
    } 
} 

private void print(String s){ 
    Log.d(TAG, s); 
} 
} 
:

이 전체 코드가

그래서 흐름을 알기 위해 일련의 로그 태그를주었습니다. 여기에 문제가 있습니다. 카메라 또는 갤러리를 선택할 때마다 올바르게 열리고 이미지를 캡처하면 beginCrop()이 호출되고 필요한 자르기 영역을 선택하고 완료를 클릭하면 아무 것도 수행되지 않습니다. 흐름이 루프에 들어가는되지 않습니다.

else if (requestCode == Crop.REQUEST_CROP) { 
     print("Crop.REQUEST_CROP called"); 
     handleCrop(resultCode, data); 
     print("handleCrop called and came to next line"); 
    } 

문제없이 다른 샘플 응용 프로그램 프로젝트에서 동일하게 작동합니다 (그것은 조각을하지 않았다)

날이 알아낼 도와주세요!

Crop.of(cropInputUri, cropOutputUri).asSquare().start(getContext(), Fragment.this, Crop.REQUEST_CROP); 
+0

나는이 : 조각에서 사용하기 때문에 Crop.of이 방법을 호출 할 때 문제가 onActivityResult를하고 requestCode가 함께 그래서 같은 라이브러리를 사용하는 경우 –

+0

@AntonKazakov 응답 해 주셔서 감사합니다. 내 응용 프로그램에서 조각을 필요로 조각을 활동으로 변경할 수 없습니다. 당신의 문제가 정확히 무엇인지 말해 주시겠습니까? 유사한 문제가 발생하면 어떤 라이브러리를 사용 했습니까? –

+0

조금만 기다려주세요 답변을 게시하십시오 –

답변

2

나는 몇 주 전에 같은 문제를 얻을 수 onActivityResult가 조각에서 제대로 호출되지 않아 동일한 문제가 발생합니다. 따라서 다른 라이브러리를 사용하거나 조각을 변경하여
+0

이것으로 무엇을 의미합니까? "ACTUAL_VALUE_OF_LIBRARI_REQUEST_CODE" 어디에서 실제 값을 얻을 수 있습니까? –

+0

나는 당신이 기대하는 가치를보고 실제 가치를 바라 봅니다. 블록에 예기 한 가치를 두십시오 –

+0

나는 당신을 얻지 못해 너무 유감입니다. 요청 코드의 가치를 어떻게 알 수 있습니까? 그걸 알 수있는 방법이 있습니까? 제발 알려주세요! –

관련 문제