2017-02-02 5 views
1

Je suis en train de faire une application pour sélectionner une image de la galerie ou google photos, puis recadrer pour en faire mon arrière-plan de l'application. Le problème auquel je suis confronté est que lorsque j'essaie de recadrer l'image en utilisant google photos, il est sauvegardé mais l'arrière-plan de l'application ne change pas et je ne reçois aucun crash ou erreur mais quand je le recadre en utilisant l'application gallery semble fonctionner parfaitement.Crop Intention en utilisant google photos ne fonctionne pas

Voici mon code pour sélectionner des photos:

Intent i = new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
          startActivityForResult(i, SELECT_PICTURE); 

case SELECT_PICTURE: { 
      if (resultCode == RESULT_OK && null != data) { 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 

         Uri selectedImageUri = data.getData(); 
         InputStream imageStream; 
         Bitmap selectedImage; 
         try { 
          cropCapturedImage(getImageUrlWithAuthority(getApplicationContext(),selectedImageUri)); 
         } catch (ActivityNotFoundException aNFE) { 
          //display an error message if user device doesn't support 
          showToast(getString(R.string.error_crop_not_supported)); 
          try { 
           String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
           Cursor cursor = getContentResolver().query(getImageUrlWithAuthority(getApplicationContext(),selectedImageUri), filePathColumn, null, null, null); 
           cursor.moveToFirst(); 
           imageStream = getContentResolver().openInputStream(getImageUrlWithAuthority(getApplicationContext(),selectedImageUri)); 
           selectedImage = BitmapFactory.decodeStream(imageStream); 

           ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
           selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
           byte[] b = baos.toByteArray(); 
           String encodedImage = Base64.encodeToString(b, Base64.DEFAULT); 
           //SharePreference to store image 
           PrefManager.putString(Constant.IMAGE_DATA, encodedImage); 
           cursor.close(); 
           //set gallery image 
           setChatBackground(); 
          } catch (FileNotFoundException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 
      } 

Voici mon code cropIntent:

public void cropCapturedImage(Uri picUri) { 
    Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
    cropIntent.setDataAndType(picUri, "image/*"); 
    cropIntent.putExtra("crop", "true"); 
    cropIntent.putExtra("aspectX", 9); 
    cropIntent.putExtra("aspectY", 14); 
    cropIntent.putExtra("outputX", 256); 
    cropIntent.putExtra("outputY", 256); 
    cropIntent.putExtra("return-data", true); 
    startActivityForResult(cropIntent, CROP_PICTURE); 
} 

ase CROP_PICTURE: { 
      Uri uri = data.getData(); 
      String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
      Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); 
      if(cursor.moveToFirst()){ 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String yourRealPath = cursor.getString(columnIndex); 
      } else { 
       //boooo, cursor doesn't have rows ... 
      } 
      cursor.close(); 
      String v= data.toString(); 

      if (resultCode == RESULT_OK && null != data) { 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          Bundle extras = data.getExtras(); 
          Bitmap thePic = extras.getParcelable("data"); 
          ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
          thePic.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
          byte[] b = baos.toByteArray(); 
          String encodedImage = Base64.encodeToString(b, Base64.DEFAULT); 
          //SharePreference to store image 
          PrefManager.putString(Constant.IMAGE_DATA, encodedImage); 
          //set gallery image 
          setChatBackground(); 
         } catch (NullPointerException e) { 
          Log.d(TAG, e.getLocalizedMessage()); 
         } 
        } 
       }); 
      } 
+0

double possible de [Aucune activité trouvée pour traiter intention com.android.camera.action.CROP] (http://stackoverflow.com/questions/41890891/no-activity- found-to-handle-intention-com-android-camera-action-crop) – W4R10CK

Répondre

1

Non, Android ne dispose pas d'une culture intention

Appel de la méthode startActivity() sur une intention avec une action de com.android.camera.action.CROP. Ils font cela pour recadrer une image.

C'est vraiment une mauvaise idée.

Source here - CommonsBlog

enter image description here

+0

J'ai essayé avec la bibliothèque d'image de recadrage ivilani et remplacé les codes de fonction cropCapturedImage() avec celui fourni dans son exemple d'application et transmis l'intention de définir l'image d'arrière-plan. Avec cela aussi l'image est recadrée et enregistrée, mais il n'y a toujours pas de changement dans mon fond d'application. Il est similaire à la question que je suis confronté avec les photos google en utilisant Crop Intent. Merci. –

0

Essayez de vous connecter à votre selectedImageUri premier.

Je suspecte que les photos de google retournent un URL à un fichier en ligne, alors que l'application de galerie retourne un chemin de fichier local.

+0

Malmygin C'était le problème au début et je n'ai pas pu sélectionner les photos de google photos j'ai résolu cela en écrivant l'image au fichier temporaire, puis en obtenant l'image uri avec autorité. Maintenant, le problème est avec l'intention de la récolte. L'application Galerie et Google Photos fournissent différentes données d'intention de récolte. Comment puis-je surmonter cela? Merci. –

+0

Eh bien, N'utilisez PAS l'intention de récolte. Utilisez l'intention uniquement pour la sélection de photos et après l'application de la culture avec l'une des bibliothèques proposées par @ w4r10ck. –