2014-10-28 2 views
0

Я пытаюсь установить изображение своих кнопок изображения, когда пользователь выбирает фотографию из галереи или снимает фотографию с помощью камеры. Проблема в том, что мои ImageButtons просто изменены на пустой образ, но я получаю каталог файлов. Что я делаю не так? Я создал свой ImageIntent и onActivityResult из этого ответа camera & gallery. Но вот мой onActivityResult метод:setImageURI не работает

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

    if (resultCode == RESULT_OK) { 
     if (requestCode == REQUEST_IMAGE_CAPTURE) { 
      final boolean isCamera; 
      if (data == null) { 
       isCamera = true; 
      } else { 
       final String action = data.getAction(); 
       if (action == null) { 
        isCamera = false; 
       } else { 
        isCamera = action 
          .equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       } 
      } 

      Uri selectedImageUri; 
      if (isCamera) { 
       selectedImageUri = outputFileUri; 
      } else { 
       selectedImageUri = data == null ? null : data.getData(); 
      } 

      ImageButton pic1 = (ImageButton) findViewById(R.id.ibPic1); 
      Toast.makeText(this, "Image saved to:\n" + selectedImageUri, 
        Toast.LENGTH_LONG).show(); 
      pic1.setImageURI(selectedImageUri); 
     } 
    } 
} 

Так я знаю из Toast, что я получаю Ури. Я пробовал this answer и различные другие решения, которые связаны с каким-то растровым изображением, но они всегда приводят к сбоям в приложении и исключения из памяти.

Редактировать

метод OnClick для запуска намерения изображения:

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.ibPic1: 
     openImageIntent(); 
     break; 
    } 
} 

Image пристальный метод

private void openImageIntent() { 

    // Determine Uri of camera image to save. 
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "Klea" + File.separator); 
    root.mkdirs(); 
    final String fname = Sell.getUniqueImageFilename(); 
    final File sdImageMainDirectory = new File(root, fname); 
    outputFileUri = Uri.fromFile(sdImageMainDirectory); 

    // Camera. 
    final List<Intent> cameraIntents = new ArrayList<Intent>(); 
    final Intent captureIntent = new Intent(
      android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    final PackageManager packageManager = getPackageManager(); 
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(
      captureIntent, 0); 
    for (ResolveInfo res : listCam) { 
     final String packageName = res.activityInfo.packageName; 
     final Intent intent = new Intent(captureIntent); 
     intent.setComponent(new ComponentName(res.activityInfo.packageName, 
       res.activityInfo.name)); 
     intent.setPackage(packageName); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
     cameraIntents.add(intent); 
    } 
    // Filesystem. 
    final Intent galleryIntent = new Intent(); 
    galleryIntent.setType("image/*"); 
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

    // Chooser of filesystem options. 
    final Intent chooserIntent = Intent.createChooser(galleryIntent, 
      "Vælg kilde"); 

    // Add the camera options. 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, 
      cameraIntents.toArray(new Parcelable[] {})); 

    startActivityForResult(chooserIntent, REQUEST_IMAGE_CAPTURE); 
} 

Получить уникальный метод имя файла:

private static String getUniqueImageFilename() { 
    // TODO Auto-generated method stub 
    String fileName = "img_" + System.currentTimeMillis() + ".jpg"; 
    return fileName; 
} 
+0

Are как галерея и камера не работает? Вы можете проверить оба? – berserk

+0

Не работают. Тост говорит «файл: // .....» для камеры и «content: // ......» для галереи. –

+0

В камере, вы получите точный uri, но в случае с галереей вы получаете контент Uri. – berserk

ответ

1

Его альтернатива, создавая растровое изображение из файла и устанавливая его. Я также включают в себя преобразование содержимого URI к фактическому URI (как размещать файл, вам необходимо фактическое URI) и выборки изображения, чтобы избежать OOM:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (resultCode == RESULT_OK) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE) { 
     final boolean isCamera; 
     if (data == null) { 
      isCamera = true; 
     } else { 
      final String action = data.getAction(); 
      if (action == null) { 
       isCamera = false; 
      } else { 
       isCamera = action 
         .equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      } 
     } 

     Uri selectedImageUri; 
     if (isCamera) { 
      selectedImageUri = outputFileUri; 
     } else { 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = activity.getContentResolver().query(
        selectedImage, filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      selectedImageUri = cursor.getString(columnIndex); 
      cursor.close(); 
     } 

     ImageButton pic1 = (ImageButton) findViewById(R.id.ibPic1); 
     Toast.makeText(this, "Image saved to:\n" + selectedImageUri, 
       Toast.LENGTH_LONG).show(); 
     //.setImageURI(selectedImageUri); 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(selectedImageUri, options); 
     options.inSampleSize = calculateInSampleSize(options, dpToPx(100), 
       dpToPx(100)); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     Bitmap bMapRotate = BitmapFactory.decodeFile(filePath, options); 
     int width = bMapRotate.getWidth(); 
     int height = bMapRotate.getHeight(); 
     if (width > height) 
      para = height; 
     else 
      para = width; 
     if (bMapRotate != null) { 
      pic1.setImageBitmap(bMapRotate); 
     } 
    } 
} 

private int dpToPx(int dp) { 
    float density = activity.getResources().getDisplayMetrics().density; 
    return Math.round((float) dp * density); 
} 

public static int calculateInSampleSize(BitmapFactory.Options options, 
     int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     // Calculate ratios of height and width to requested height and 
     // width 
     final int heightRatio = Math.round((float) height 
       /(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     // Choose the smallest ratio as inSampleSize value, this will 
     // guarantee 
     // a final image with both dimensions larger than or equal to the 
     // requested height and width. 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 

    return inSampleSize; 
} 
+0

Работает, но не тогда, когда я использую камеру, вот как я получаю: outputFileUri = Uri.fromFile (sdImageMainDirectory); и я изменил: else if (requestCode == CAMERA_REQUEST && resultCode == -1) { filePath = outputFileUri; to outputFileUri.toString(); Также я не знаю, означает ли это что-либо, что у меня нет кода CAMERA_REQUEST, так как я запускаю openImageIntent с одного намерения выбирать из камеры или других библиотек изображений. Вы хотите, чтобы я опубликовал метод намерения? –

+0

@ KæmpeKlunker Просто нужно немного поменять в соответствии с вами. Подобно тому, как вы использовали boolean для проверки камеры или галереи, я проверяю код запроса. CAMERA_REQUEST - это всего лишь номер для запроса кода камеры. – berserk

+0

Да, я знаю это, но у вас есть как RESULT_LOAD_IMAGE, так и CAMERA_REQUEST, где у меня есть: startActivityForResult (chooserIntent, int); поэтому я не знаю, как я могу определить каждый номер? Вы можете проверить мои вопросы на первой ссылке «камера и галерея», чтобы увидеть код, его наиболее ответный ответ. –

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