2017-02-19 22 views
0

извините за любые грамматические ошибки.Фото потеряет свое качество, когда оно появляется в ImageView

Я сделал приложение, которое позволяет сделать снимок, и после того, как вы нажмете «ОК», изображение появится в ImageView. Теперь я не знаю, почему, когда я пытаюсь выполнить это приложение на своем Nexus 5X, фото потеряет качество, когда оно появляется в ImageView. Применение изображения (Image View): Application Image камеры Изображение: Real Image

фрагмент кода:

public class CameraFragment extends Fragment{ 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    dispatchTakePictureIntent(); 
    return inflater.inflate(R.layout.fragment_camera,container,false); 
} 

ImageView SkimmedImageImg; 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    SkimmedImageImg = (ImageView)view.findViewById(R.id.SkimmedImg); 
} 

static final int REQUEST_IMAGE_CAPTURE = 1; 

private void dispatchTakePictureIntent() { 
    Fragment CameraFragment = this; 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    CameraFragment.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == Activity.RESULT_OK){ 
     if(requestCode == REQUEST_IMAGE_CAPTURE){ 
      Bitmap SkimmedImgData = (Bitmap) data.getExtras().get("data"); 
      SkimmedImageImg.setImageBitmap(SkimmedImgData); 
     } 
    } 
} 

}

+0

Я добавил новый ответ. На этот раз я запустил код, и он работает отлично. Вы можете это проверить. – tahsinRupam

ответ

0

Просто скопируйте наклеить весь класс:

public class CameraFragment extends android.support.v4.app.Fragment{ 

    String mCurrentPhotoPath; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final int MyVersion = Build.VERSION.SDK_INT; 
     if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) { 
      if (!checkIfAlreadyhavePermission_new()) { 
       requestPermissions(new String[]{Manifest.permission.CAMERA}, 1); 
      } else { 
       if (!checkIfAlreadyhavePermission()) { 
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 2); 
       } else { 
        try { 
         dispatchTakePictureIntent(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } else { 
      try { 
       dispatchTakePictureIntent(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return inflater.inflate(R.layout.fragment_camera,container,false); 
    } 

    ImageView SkimmedImageImg; 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     SkimmedImageImg = (ImageView)view.findViewById(R.id.SkimmedImg); 
    } 

    static final int REQUEST_IMAGE_CAPTURE = 1; 

    private void dispatchTakePictureIntent() throws IOException { 
     CameraFragment cameraFragment = this; 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 
       // Error occurred while creating the File 
       return; 
      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       Uri photoURI = FileProvider.getUriForFile(getActivity(), 
         BuildConfig.APPLICATION_ID + ".provider", 
         createImageFile());; 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       cameraFragment.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
      } 
     } 

    } 

    private boolean checkIfAlreadyhavePermission() { 
     int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE); 
     return result == PackageManager.PERMISSION_GRANTED; 
    } 

    private boolean checkIfAlreadyhavePermission_new() { 
     int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA); 
     return result == PackageManager.PERMISSION_GRANTED; 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode == Activity.RESULT_OK) { 
      if (requestCode == REQUEST_IMAGE_CAPTURE) { 
       Uri imageUri = Uri.parse(mCurrentPhotoPath); 
       File file = new File(imageUri.getPath()); 
       Glide.with(getActivity()) 
        .load(file) 
        .into(SkimmedImageImg); 

       // ScanFile so it will be appeared on Gallery 
       MediaScannerConnection.scanFile(getActivity(), 
         new String[]{imageUri.getPath()}, null, 
         new MediaScannerConnection.OnScanCompletedListener() { 
          public void onScanCompleted(String path, Uri uri) { 
          } 
         }); 
      } 
     } 

    } 

    private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 
     File storageDir = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_DCIM), "Camera"); 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 

     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
     return image; 
    } 


    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case 1: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        if (!checkIfAlreadyhavePermission()) { 
         requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 2); 
        } else { 
         try { 
          dispatchTakePictureIntent(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       } else { 
        Toast.makeText(getActivity(), "NEED CAMERA PERMISSION", Toast.LENGTH_LONG).show(); 
       } 
       break; 
      } 

      case 2: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        try { 
         dispatchTakePictureIntent(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } else { 
        Toast.makeText(getActivity(), "NEED STORAGE PERMISSION", Toast.LENGTH_LONG).show(); 
       } 
       break; 
      } 
      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

} 

Если вы получаете сообщение об ошибке во время загрузки фрагмента в MainActivity, просто используйте getSupportFragmentManager():

FragmentManager fm = getSupportFragmentManager(); 
+0

tahsinRupam, извините, если я не ответил вам раньше (я сломал компьютер). Во всяком случае, у меня проблема с другим приложением, если бы вы могли мне помочь, это было бы фантастически. Я связываюсь с вами здесь, потому что я не знаю другого способа, извините меня, если это не лучший способ сделать это. http://stackoverflow.com/questions/43237864/keeping-the-cpu-of-the-device-awake – RvGPredator

+0

Все в порядке. Я постараюсь изо всех сил помочь вам. – tahsinRupam

+0

Извините, у меня нет опыта в этом приложении. Тем не менее, я соберу некоторые знания и попытаюсь предложить вам какое-либо решение проблемы. – tahsinRupam

1

При вызове Bitmap SkimmedImgData = (Bitmap) data.getExtras().get("data");, а затем установить изображение с помощью SkimmedImageImg.setImageBitmap(SkimmedImgData);, вы только установив миниатюру изображения, которое вы взяли, поэтому качество искажено. Вы можете следить за учебником this, в котором будет показано, как сохранить полноразмерное изображение, посмотреть под заголовком Сохранить полноразмерную фотографию.

+0

Я прочитал учебник, и я попытался сделать что-то вроде этого: http://pastebin.com/WRAzR71V Но я работаю над фрагментом, поэтому получаю некоторые ошибки, читаю пасту для получения дополнительной информации. – RvGPredator

+0

Используйте 'getActivity() 'вместо' this' –