2010-01-18 6 views
27

Hey, ich arbeite gerade an einem Live Wallpaper und ich erlaube dem Benutzer ein Bild auszuwählen, das hinter meinen Effekten verschwindet.Wie wähle ich ein Bild in android?

Zur Zeit habe ich:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      i.putExtra("crop", "true"); 
      startActivityForResult(i, 1); 

Und leicht unter das:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 1) 
     if (resultCode == Activity.RESULT_OK) { 
      Uri selectedImage = data.getData(); 
      Log.d("IMAGE SEL", "" + selectedImage); 
      // TODO Do something with the select image URI 
      SharedPreferences customSharedPreference = getSharedPreferences("imagePref", Activity.MODE_PRIVATE); 
      SharedPreferences.Editor editor = customSharedPreference.edit(); 
      Log.d("HO", "" + selectedImage); 
      editor.putString("imagePref", getRealPathFromURI(selectedImage)); 
      Log.d("IMAGE SEL", getRealPathFromURI(selectedImage)); 
      editor.commit(); 
     } 
    } 

Wenn mein Code ran ist, Logcat mir sagt, dass SelectedImage null ist. Wenn ich der

Kommentar aus
i.putExtra("crop", "true"): 

Logcat gibt mir nicht die Null-Zeiger Ausnahme, und ich bin in der Lage zu tun, was ich mit dem Bild will. Also, was ist das Problem hier? Hat jemand eine Idee, wie ich das beheben kann? Vielen Dank für Ihre Zeit.

+0

Ich habe die gleiche Frage, und dieser Thread hilft, http://stackoverflow.com/questions/8238460/android-2-1-crop-image-fail – user538565

+0

ein anderes ähnliches Thema: http: //stackoverflow.com/questions/12758425/how-to-set-the-output-image-use-com-android-camera-action-crop/ – hcpl

Antwort

45

Ich habe auch dieses Problem konfrontiert. Sie können mit diesem Code versuchen. Sein für mich adaequat

private static final String TEMP_PHOTO_FILE = "temporary_holder.jpg"; 

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 
     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
photoPickerIntent.setType("image/*"); 
photoPickerIntent.putExtra("crop", "true"); 
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 
photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 

private Uri getTempUri() { 
    return Uri.fromFile(getTempFile()); 
} 

private File getTempFile() { 

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 

     File file = new File(Environment.getExternalStorageDirectory(),TEMP_PHOTO_FILE); 
     try { 
      file.createNewFile(); 
     } catch (IOException e) {} 

     return file; 
    } else { 

     return null; 
    } 
} 

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

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch (requestCode) { 
     case REQ_CODE_PICK_IMAGE: 
      if (resultCode == RESULT_OK) { 
       if (imageReturnedIntent!=null) { 

        File tempFile = getTempFile(); 

        String filePath= Environment.getExternalStorageDirectory() 
         +"/"+TEMP_PHOTO_FILE; 
        System.out.println("path "+filePath); 


        Bitmap selectedImage = BitmapFactory.decodeFile(filePath); 
        _image = (ImageView) findViewById(R.id.image); 
        _image.setImageBitmap(selectedImage); 

        if (tempFile.exists()) tempFile.delete(); 
       } 
      } 
    }  
} 
+0

hallo jennifer! Hast du das in 4.1 getestet? ??? –

+2

Denken Sie nur daran, wenn Sie Dateien löschen möchten, müssen Sie diese Berechtigung wahrscheinlich zu Ihrem Manifest hinzufügen: '' – HGPB

+0

@Haraldo. Ich habe es nicht in Android 4.1 überprüft. Ich überprüfe und aktualisiere – jennifer

6

Sie benötigen keine Temp-Datei benötigen:

protected static final int REQ_CODE_PICK_IMAGE = 1; 



Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    photoPickerIntent.setType("image/*"); 
    photoPickerIntent.putExtra("crop", "true"); 
    photoPickerIntent.putExtra("return-data", true); 
    photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
    startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 


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

     super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

     switch (requestCode) { 
      case REQ_CODE_PICK_IMAGE: 
       if (resultCode == RESULT_OK) { 
        if (imageReturnedIntent!=null) { 
         Bundle extras = imageReturnedIntent.getExtras(); 
         Bitmap selectedBitmap = extras.getParcelable("data"); 
         imageR = (ImageView) findViewById(R.id.image); 
         imageR.setImageBitmap(selectedBitmap); 
        } 
       } 
     }  
} 
+1

Sie speicherten meinen Tag! Auf 4.3- - hat gut funktioniert. auf 4.4+ kann übliche Variante verwenden: imageStream = getContentResolver(). openInputStream (imageuri); Bitmap bmap = BitmapFactory.decodeStream (imageStream); – kaftanati

+0

Dies funktioniert nicht, wenn die Google Fotos App ausgewählt wurde, um ein Bild auszuwählen – Gaurav

0

Dieser Code gut mit "Anfänger" ^^

private Bitmap FixBitmap; 
Bitmap thePicBitmap; 
String ImagePath = "image_path"; 
String ImagePath_1; 
private static final String TEMP_PHOTO_FILE = "temporary_holder.jpg"; 
private static final int REQ_CODE_PICK_IMAGE = 0; 




@Override 
     public void onClick(View view) { 
      try { 




      //intent = new Intent(); 
      // intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      //intent.setAction(Intent.ACTION_GET_CONTENT); 
      photoPickerIntent.setType("image/*"); 
      photoPickerIntent.putExtra("crop", "true"); 
      photoPickerIntent.putExtra("scale", true); 
      photoPickerIntent.putExtra("aspectX", 1); 
      photoPickerIntent.putExtra("aspectY", 1); 
      // indicate output X and Y 
      photoPickerIntent.putExtra("outputX", 150); 
      photoPickerIntent.putExtra("outputY", 100); 


      photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 
      photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
      startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 




      } catch (Exception e) { 
       // Toast.makeText(getApplicationContext(), R.string.imageException, Toast.LENGTH_LONG).show(); 
       Log.e(e.getClass().getName(), e.getMessage(), e); 
       Toast toast = Toast.makeText(Upload_image_text.this, "This device doesn't support the crop action!", 
         Toast.LENGTH_SHORT); 
       toast.show(); 
      } 




     } 

     private Uri getTempUri() { 
      return Uri.fromFile(getTempFile()); 
      } 

     private File getTempFile() { 
      if (isSDCARDMounted()) { 

      File f = new File(Environment.getExternalStorageDirectory(),TEMP_PHOTO_FILE); 
      try { 
      f.createNewFile(); 
      } catch (IOException e) { 

      } 
      return f; 
      } else { 
      return null; 
      } 
      } 

     private boolean isSDCARDMounted(){ 
      String status = Environment.getExternalStorageState(); 
      if (status.equals(Environment.MEDIA_MOUNTED)) 
      return true; 
      return false; 
      } 
    }); 

====== =================

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 


    switch (requestCode) { 
    case REQ_CODE_PICK_IMAGE: 
     if (resultCode == RESULT_OK) { 
      if (imageReturnedIntent!=null){ 



      //  File tempFile = getTempFile(); 

       ImagePath_1 = Environment.getExternalStorageDirectory() 
      + "/temporary_holder.jpg"; 
       System.out.println("path "+ImagePath_1); 


       FixBitmap = BitmapFactory.decodeFile(ImagePath_1); 
       ShowSelectedImage = (ImageView)findViewById(R.id.imageView); 
       ShowSelectedImage.setImageBitmap(FixBitmap); 



      } 
     } 
    } 
} 

========================== =====

@Override 
     protected String doInBackground(Void... params) { 


      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 1; 
      //options.outWidth = 50; 
      //options.outHeight = 50; 
      FixBitmap = BitmapFactory.decodeFile(ImagePath_1, options); 
      //FixBitmap = BitmapFactory.decodeResource(getResources(), R.id.imageView); 

      byteArrayOutputStream = new ByteArrayOutputStream(); 
      FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); //compress to 50% of original image quality 
      byteArray = byteArrayOutputStream.toByteArray(); 

      ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);