2016-03-24 6 views
0

Ich habe ein Problem mit der Bildanzeige in meinen Android-Apps, ich möchte das Bild in Runde, nachdem ich ein Bild von der Kamera oder Bild aus der Galerie. wenn ich mit dem Bild von der Kamera gehe, ist das normalerweise Funktion, aber wenn ich gehe, um das Bild von der Galerie zu bekommen, habe ich einen Fehler bekommen, wo ich nicht in logcat zeige.ImageView kein Bild anzeigen, wenn ein Bild aus der Galerie Android Apps

hier mein Code:

dieser Code das Optionsmenü aufrufen Bild aufzunehmen oder aus der Galerie zu erhalten:

private void selectImage() { 
    final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" }; 
    AlertDialog.Builder builder = new AlertDialog.Builder(ActivityRegister.this); 
    builder.setTitle("Add Photo!"); 
    builder.setItems(options, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int item) { 
      if (options[item].equals("Take Photo")) { 
       //define the file-name to save photo taken by Camera activity 
       String fileName = "new-photo-name.jpg"; 
       //create parameters for Intent with filename 
       ContentValues values = new ContentValues(); 
       values.put(MediaStore.Images.Media.TITLE, fileName); 
       values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera"); 
       //imageUri is the current activity attribute, define and save it for later usage (also in onSaveInstanceState) 
       imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
       //create new Intent 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
       intent.putExtra("crop", "true"); 
       intent.putExtra("aspectX", -1); 
       intent.putExtra("aspectY", -1); 
       intent.putExtra("outputX", 200); 
       intent.putExtra("outputY", 200); 

       startActivityForResult(intent, PICK_Camera_IMAGE); 
      }else if (options[item].equals("Choose from Gallery")){ 
       try{ 
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        intent.setType("image/*"); 
        intent.putExtra("crop", "true"); 
        intent.putExtra("aspectX", -1); 
        intent.putExtra("aspectY", -1); 
        intent.putExtra("outputX", 200); 
        intent.putExtra("outputY", 200); 
        intent.putExtra("return-data", true); 

        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 
       }catch (Exception e){ 
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
        Log.e(e.getClass().getName(), e.getMessage(), e); 
       } 
      }else if (options[item].equals("Cancel")){ 
       dialog.dismiss(); 
      } 
     } 
    }); 
    builder.show(); 
} 

Ernte um das Bild zu abzurunden:

public Bitmap getCroppedBitmap(Bitmap bitmap) { 
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 

    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    canvas.drawCircle(bitmap.getWidth()/2, bitmap.getHeight()/2, bitmap.getWidth()/2, paint); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 
    Bitmap _bmp = Bitmap.createScaledBitmap(output, 300, 300, false); 
    return _bmp; 
} 

und diesen Code das Bild von der Kamera oder Galerie zu decodieren

public void decodeFile(String filePath) { 
    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filePath, o); 
    // The new size we want to scale to 
    final int REQUIRED_SIZE = 1024; 
    // Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 
    while (true) { 
     if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) 
      break; 
     width_tmp /= 2; 
     height_tmp /= 2; 
     scale *= 2; 
    } 
    // Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    bitmap = BitmapFactory.decodeFile(filePath, o2); 
    ivImages.setImageBitmap(getCroppedBitmap(bitmap)); 
} 

dies mein onActivityResult() Code:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Uri selectedImageUri = null; 
    String filePath = null; 
    switch (requestCode) { 
     case PICK_IMAGE: 
      if (resultCode == Activity.RESULT_OK) { 
       Bundle extra = data.getExtras(); 
       if(extra != null) { 
        selectedImageUri = data.getData(); 
       } 
      } 
      break; 
     case PICK_Camera_IMAGE: 
      if (resultCode == RESULT_OK) { 
       //use imageUri here to access the image 
       selectedImageUri = imageUri; 
       /* 
       Bitmap mPic = (Bitmap) data.getExtras().get("data"); 
       selectedImageUri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), mPic, getResources().getString(R.string.app_name), Long.toString(System.currentTimeMillis()))); 
       */ 
      } else if (resultCode == RESULT_CANCELED) { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
    } 

    if(selectedImageUri != null){ 
     try { 
      // OI FILE Manager 
      String filemanagerstring = selectedImageUri.getPath(); 
      // MEDIA GALLERY 
      String selectedImagePath = getPath(selectedImageUri); 
      if (selectedImagePath != null) { 
       filePath = selectedImagePath; 
      } else if (filemanagerstring != null) { 
       filePath = filemanagerstring; 
      } else { 
       Toast.makeText(getApplicationContext(), "Unknown path", Toast.LENGTH_LONG).show(); 
       Log.e("Bitmap", "Unknown path"); 
      } 

      if (filePath != null) { 
       decodeFile(filePath); 
      } else { 
       bitmap = null; 
      } 
     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), "Internal error", Toast.LENGTH_LONG).show(); 
      Log.e(e.getClass().getName(), e.getMessage(), e); 
     } 
    } 
} 

Sorry für mein schlechtes Englisch

+0

Haben Sie ONActivityResult() übergangen? – Jois

+0

Teilen Sie Ihren onActivityResult() Code. – AKSiddique

+0

Ich habe keine Überschreibung in onActivityResult(). @Jois –

Antwort

0

Ich hatte das gleiche Problem. Um das Bild zu bekommen, mach es so. Das funktionierte für mich

Wenn Sie versuchen, das ImageView auf dieses ausgewählte Bild zu setzen, dann geht der Code so.

Aktivitätsklasse

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

    if (resultCode == RESULT_OK && null != data) { 
     Uri selectedImage = data.getData(); 





     Bitmap bitmap = null; 
     try { 
      bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Bitmap resized = Bitmap.createScaledBitmap(bitmap, 100, 100, true); 
       imageView.setImageBitmap(ProfilePicture.getRoundedRectBitmap(resized)); 



    } 


} 

ImageConvertor Klasse

public class ProfilePicture { 
    public static Bitmap getRoundedRectBitmap() { 
     Bitmap result = null; 
     try { 
      result = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888); 
      Canvas canvas = new Canvas(result); 

      int color = 0xff424242; 
      Paint paint = new Paint(); 
      Rect rect = new Rect(0, 0, 200, 200); 

      paint.setAntiAlias(true); 
      canvas.drawARGB(0, 0, 0, 0); 
      paint.setColor(color); 
      canvas.drawCircle(50, 50, 50, paint); 
      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 



     } catch (NullPointerException e) { 
     } catch (OutOfMemoryError o) { 
     } 
     return result; 
    } 

diese Linie MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage); helfen Ihnen, das ausgewählte Bild aus der Galerie mit Hilfe von ContentResolver zu bekommen.

Ich hoffe, das war hilfreich. Thnakyou

+0

können Sie auf meinem Code implementieren? Vielen Dank für Ihre Hilfe @Jois, –

+0

, und ich habe das gelöst. Danke, –

+0

Ich habe meinen Code bearbeitet. Ich habe eine neue Klasse namens profilePicture hinzugefügt. Verwenden Sie es in Ihrem Code eigentlich ist es einfach. Ich hoffe, das war hilfreich – Jois

Verwandte Themen