2016-09-20 6 views
0

내 전체 코드 읽기. MarshmallowLollipop을 제외한 모든 전화에서 완벽하게 작동합니다. MarshmallowLollipop 전화에서만 문제가 발생합니다 data.getData()null의 경우에만 의 경우에만 캡처 됨. 갤러리에서 사진을 선택onActivityResult가 인 텐트를 반환 함 data.getData(); 마시멜로와 롤리팝에서만 항상 널입니다.

  1. Imageview에서의 썸네일 표시 - - 작동 미세 조정을 내가 비디오 .I를 캡처 할 경우 4 케이스가 잘 작동된다. MarshmallowLollipop 작동하지 -

  2. 카메라에서

    캡처 사진 및 Imageview은 그것의 축소판을 보여줍니다.

  3. 갤러리에서 비디오를 선택하고 섬네일을 Imageview - Working Fine에 표시하십시오.

  4. 3. 카메라에서 비디오를 캡처하고 섬네일을 Imageview - Working Fine으로 표시하십시오.

지금 많은 솔루션이 있지만 코드가 왜 이미지 캡처 작동하지 자사의 비디오 캡처의 경우에는 벌금을 작동하면 그 중 어느 것도 만족스러운 모습? 그것은 버그인가, 아니면 내가 잘못 어딘가에하고 있는가?

여기가 내 코드입니다. 충돌 그것은 산들을 제외한 모든 전화에 완벽하게 작동하고 롤리팝있다 적 있었

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     int THUMBSIZE = 120; 
     switch (requestCode){ 


     case RESULT_LOAD_IMAGE: 


      if (resultCode==RESULT_OK){ 
       String column_Name= MediaStore.Images.Media.DATA; 
       String picturePath=getPath(column_Name,data.getData()); 
       Bitmap orientedBitmap = ExifUtil.rotateBitmap(picturePath, BitmapFactory.decodeFile(picturePath)); 
       Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.extractThumbnail(orientedBitmap, THUMBSIZE, THUMBSIZE)); 
       thumbnailview.setBackground(fullpic); 
       editText.setText(picturePath); 
       picker.setVisibility(View.VISIBLE); 
       thumbnailview.setClickable(false); 

      } 
      break; 

     case REQUEST_IMAGE_CAPTURE: 

      if (resultCode==RESULT_OK){ 
       String picturePath=""; 
       String column_Name=MediaStore.Images.Media.DATA; 

       picturePath=getPath(column_Name,data.getData()); 

        //My app Crashes here because in Marshmallow data.getData() is always null. 

       Bitmap orientedBitmap = ExifUtil.rotateBitmap(picturePath, BitmapFactory.decodeFile(picturePath)); 
       Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.extractThumbnail(orientedBitmap, THUMBSIZE, THUMBSIZE)); 
       thumbnailview.setBackground(fullpic); 
       editText.setText(picturePath); 
       picker.setVisibility(View.VISIBLE); 
       thumbnailview.setClickable(false); 


      } 
      break; 

     case RESULT_LOAD_VIDEO: 

      if (resultCode==RESULT_OK){ 
       String column_Name=MediaStore.Video.Media.DATA; 
       String videoPath=getPath(column_Name,data.getData()); 
       Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Video.Thumbnails.MINI_KIND)); 
       thumbnailview.setBackground(fullpic); 
       editText.setText(videoPath); 
       picker.setVisibility(View.VISIBLE); 
       thumbnailview.setClickable(false); 


      } 
      break; 

     case REQUEST_VIDEO_CAPTURE: 

      if (resultCode==RESULT_OK){ 
       String column_Name=MediaStore.Video.Media.DATA; 
       String videoPath=getPath(column_Name,data.getData()); 
       Drawable fullpic=new BitmapDrawable(getResources(),ThumbnailUtils.createVideoThumbnail(videoPath,MediaStore.Video.Thumbnails.MINI_KIND)); 
       thumbnailview.setBackground(fullpic); 
       editText.setText(videoPath); 
       picker.setVisibility(View.VISIBLE); 
       thumbnailview.setClickable(false); 


      } 
      break; 
    } 

    if (picker != null) { 
     picker.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       OpenDialog(); 
      } 
     }); 
    } 

} 


private String getPath(String column_Name,Uri uri){ 

    String[] projection = {column_Name}; 
    String path = ""; 
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
    int column_index_data ; 
    if (cursor != null) { 
     column_index_data = cursor.getColumnIndexOrThrow(column_Name); 
     cursor.moveToFirst(); 
     path = cursor.getString(column_index_data); 
     cursor.close(); 
    } 

    return path; 
} 

private void OpenDialog(){ 
    dialogBox.setTitle("Select an Action"); 
    dialogBox.setMessage("Choose Picture or Video"); 

    dialogBox.setPositiveButton("Picture", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if (check_Permissions()){ 
       OpenCameraDialog(); 
      } 
      else { 
       request_Permissions(); 
       CAMERA_DIALOG_PERMISSION=1; 

      } 
     } 
    }); 

    dialogBox.setNegativeButton("Video", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if (check_Permissions()){ 
       OpenVideoDialog(); 
      } 
      else { 
       request_Permissions(); 
       VIDEO_DIALOG_PERMISSION=1; 
      } 

     } 
    }); 

    dialogBox.show(); 

} 



private void OpenCameraDialog(){ 

    dialogBox.setTitle("Select an Action"); 
    dialogBox.setMessage("Choose Picture From"); 

    dialogBox.setPositiveButton("Gallery", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      final Intent galleryintent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(galleryintent, RESULT_LOAD_IMAGE); 
     } 
    }); 

    dialogBox.setNegativeButton("Camera", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 

     } 
    }); 

    dialogBox.show(); 

} 

private void OpenVideoDialog(){ 

    dialogBox.setTitle("Select an Action"); 
    dialogBox.setMessage("Choose Video From"); 

    dialogBox.setPositiveButton("Gallery", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      final Intent galleryintent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(galleryintent, RESULT_LOAD_VIDEO); 
     } 
    }); 

    dialogBox.setNegativeButton("Camera", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      final Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 

      if (takeVideoIntent.resolveActivity(getPackageManager()) != null) { 
       startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE); 
      } 
     } 
    }); 
    dialogBox.show(); 

} 

private boolean check_Permissions(){ 

    boolean GRANTED; 

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) + 
      ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) + 
      ContextCompat.checkSelfPermission(this,Manifest.permission.RECORD_AUDIO) + 
      ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){ 
     GRANTED=false; 

    } 
    else { 
     GRANTED=true; 
    } 
    return GRANTED; 
} 

private void request_Permissions(){ 
    ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO}, 
      REQUEST_FOR_PERMISSION); 

} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode){ 

     case REQUEST_FOR_PERMISSION: 

      if ((grantResults.length>0)&& (grantResults[0] +grantResults[1]+grantResults[2]+grantResults[3]== PackageManager.PERMISSION_GRANTED)){ 

       if (CAMERA_DIALOG_PERMISSION==1){ 
        OpenCameraDialog(); 
        CAMERA_DIALOG_PERMISSION=0; 
       } 
       else if (VIDEO_DIALOG_PERMISSION==1){ 
        OpenVideoDialog(); 
        VIDEO_DIALOG_PERMISSION=0; 
       } 

      } 
      else { 
       Toast.makeText(this, "Please GRANT Permissions", Toast.LENGTH_SHORT).show(); 
      } 

    } 

} 

답변

0

으로, -

카메라 앱은 URI를 반환 할 필요가 없습니다. 또한

,

당신은 어디에 이미지를 작성하는 카메라 응용 프로그램을 알려야합니다.

그래서, 내가

final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      pictureUri=getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,pictureUri); 
      startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 

뿐인데 내 코드를 대체 onActivityResult에 -

case REQUEST_IMAGE_CAPTURE: 

      if (resultCode==RESULT_OK){ 
       String picturePath=""; 
       String column_Name= MediaStore.Images.Media.DATA; 
       if (data!=null){ 
       if (data.getData()!=null){ 
       picturePath=getPathfromUri(column_Name,data.getData());} 

       else { 
        picturePath= pictureUri.getPath(); 

       } 
       } 
       else { 
        picturePath= pictureUri.getPath(); 

       }} 
1

아니, 그렇지 어디 라인을 주석했다. 사용자가 ACTION_IMAGE_CAPTURE 요청을 처리 할 수있는 잘 작성된 카메라 앱을 선택하면 많은 Android 버전에서 오류가 발생합니다.

의 문제가이있다 :

  if (data.getData()!=null){ 
      picturePath=getPath(column_Name,data.getData());} 
      else { 
       //My app Crashes here because in Marshmallow data.getData() is always null. 
      } 

적어도 두 개의 결함이 여기에있다.

큰 것은 UriACTION_IMAGE_CAPTURE에서 다시 얻는 것으로 가정합니다. That is not documented이고 카메라 앱은 Uri을 반환 할 필요가 없습니다. 특히 구조에서 getExtra("data")을 통해 미리보기 이미지 만 다시 표시됩니다. 전체 크기 이미지가 필요한 경우 IntentEXTRA_OUTPUT을 사용하십시오.이 경우 이미지가 저장되는 위치는 —이며 어디서나 EXTRA_OUTPUT으로 표시됩니다.

다른 하나는 Uri이 (가) MediaStore에서 왔다고 가정하면 그렇지 않으면 MediaStore.Video.Media.DATA 열입니다. 카메라 앱이 Uri을 반환 할 필요가 없을뿐만 아니라 UriMediaStore에서 온 것이 아니거나 그러한 열이 필요하지 않습니다[email protected]에 의해 제안

+0

지금보기 나는 내가 만약 다른 사용하고 있지 않다 내 코드를 업데이트 한 .. 내가 잘못 죄송 게시 –

+0

EXTRA OUTPUT과 함께 putExtra에서 무엇을 전달해야합니까? @CommonsWare –

+0

@KarandeepAtwal : 이상적으로는'ContentProvider'에 의해 지원되는'Uri'를 사용하십시오. 'file :''Uri'를 사용할 수는 있지만 Android 7.0+에서는 targetSdkVersion이 24+ 이상에서는 작동하지 않습니다. 예제는 [이 샘플 프로젝트] (https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider)를 참조하십시오. – CommonsWare