2016-09-20 7 views
0

Читать весь мой код. Он отлично работает на каждом телефоне, кроме Marshmallow и Lollipop. В телефонах Marshmallow и Lollipop только проблема приходит в data.getData() возвращение null только в случае Захвачено изображение. Она работает нормально, если я захватить видео .I есть 4 случая -onActivityResult return Intent data.getData(); всегда Null Только в Marshmallow и Lollipop

  1. Выбор Изображение из галереи и показать его миниатюру в Imageview - работает отлично.

  2. Захват изображение с камеры и показать его миниатюру в Imageview - НЕ РАБОТАЮ в Marshmallow и Lollipop.

  3. Выбор видео из галереи и показать его миниатюру в Imageview - Работает отлично.

  4. 3.Capturing Video from Camera и показать его миниатюру в Imageview - Работает отлично.

Сейчас Есть много решений, но ни один из них выглядит удовлетворительной, если код работает отлично в случае захвата видео, то почему ее не работает для захвата изображения? Является ли это ошибка или я делаю неправильно где-нибудь?

Вот мой код. Я комментировал линию, где аварии happens-

@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

Как, предложенные @CommonsWare -

Camera App не нужно возвращать 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

Он прекрасно работает на каждом телефоне, кроме Зефир и Lollipop

Нет, это не так. Это не удастся для многих версий Android, когда пользователь выберет хорошо написанное приложение для камеры, чтобы обработать ваш запрос ACTION_IMAGE_CAPTURE.

Ваша проблема заключается здесь:

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

Есть по крайней мере два недостатка здесь.

Большой считается, что вы получаете Uri от ACTION_IMAGE_CAPTURE. That is not documented, а приложениям камер не нужно возвращать Uri. В частности, в вашей структуре вы получите только миниатюру, используя getExtra("data"). Если вы хотите полноразмерное изображение, используйте EXTRA_OUTPUT на своем Intent, и в этом случае вы знаете, где хранится изображение. — это где вы указываете в EXTRA_OUTPUT.

Другой - это то, что вы принимаете, что вы возвращаете MediaStore или иным образом имеет столбец MediaStore.Video.Media.DATA. Не только приложениям с камерой не нужно возвращать Uri, но нет требования, чтобы Uri был от MediaStore или имел такой столбец.

+0

Смотрите сейчас я обновил свой код я не использую, если еще .. я отправил неправильно извиняюсь –

+0

Что мне передать в putExtra вместе с EXTRA OUTPUT? @CommonsWare –

+0

@KarandeepAtwal: В идеале используйте 'Uri', который поддерживается' ContentProvider'. Вы можете использовать 'файл:' 'Uri', но это не будет работать на Android 7.0+ с' targetSdkVersion' из 24+. См. [Этот пример проекта] (https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider) для примера. – CommonsWare

 Смежные вопросы

  • Нет связанных вопросов^_^