2017-08-30 7 views
-1

J'ai suivi Google's guide Receiving Simple Data from Other Apps et j'ai réussi à obtenir l'URI comme promis, mon icône de l'application est affichée lorsqu'une image doit être partagée.Les données d'image simples reçues d'autres applications ont une résolution inférieure ou égale à 0

Pourtant, il y a un problème spécifique, voici comment il va:

if (Intent.ACTION_SEND.equals(action) && type != null) { 
    if (type.startsWith("image/")) { 
     handleSendImage(intent); // Handle single image being sent 
    } 
} 

handleSendImage(intent); conduit à

void handleSendImage(Intent intent) { 
    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 
    if (imageUri != null) { 
     pfadPhoto = getRealPathFromURI_API19(this, imageUri); 
     i("handleSendImage "+pfadPhoto); 
     fBildVerkleinern(pfadPhoto); 
    } 
} 

public String getRealPathFromURI_API19(Context context, Uri uri){ 
    String result; 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    if (cursor == null) { // Source is Dropbox or other similar local file path 
     result = uri.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
     result = cursor.getString(idx); 
     cursor.close(); 
    } 
    return result; 
}  

fBildVerkleinern(pfadPhoto); conduit à

private void fBildVerkleinern(String bildpfad) { 
... 
iv = (ImageView)findViewById(R.id.mImageView); 
int ivBreite = iv.getWidth(); 
int ivHoehe = iv.getHeight(); 
... 
v = BitmapFactory.decodeFile(bildpfad); //bildpfad = pfadPhoto 
... 
bitmap2 = getResizedBitmap(v,(int)((float)ivBreite/vergroesserungsFaktor),ivBreite); 
... 
} 

getResizedBitmap conduit à

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 
    if (bm != null) { 
     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     Matrix matrix = new Matrix(); 
     matrix.postScale(scaleWidth, scaleHeight); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
     return resizedBitmap; 
    } 
    return null; 
} 

et Bitmap.createBitmap conduit à

Caused by: java.lang.IllegalArgumentException: width and height must be > 0 

Pourtant, j'ai aussi un onActivityResult qui est exécuté après une sélection d'image a lieu avec le gestionnaire de fichiers qui ressemble à

if (requestCode == CHOOSE_PHOTO) { 
    if (data == null) { 
     f("Fehler"); 
     return; 
    } 
    pfadPhoto = getRealPathFromURI_API19(this, data.getData()); 
    fBildVerkleinern(pfadPhoto); 
    ... 
} 

et cela fonctionne sans problème.

Où voyez-vous l'erreur?

Répondre

0

J'ai suivi le guide de Google Réception de données simples à partir d'autres applications

Non, vous ne l'avez pas. Il n'y a pas de méthode getRealPathFromURI_API19() dans ce guide. C'est pour une très bonne raison: ça ne marche pas en général.

Donc, supprimez-le. Au lieu de cela, utilisez votre bibliothèque de chargement d'image préférée pour charger l'image à partir de Uri. Ou, dans le pire des cas, utilisez getContentResolver().openInputStream() pour obtenir un InputStream sur le contenu identifié par Uri, puis passez ce flux à BitmapFactory.decodeStream(). Faites simplement cette E/S sur un thread d'arrière-plan, s'il vous plaît (quelles bibliothèques de chargement d'images géreront pour vous, parmi d'autres avantages).

et cela fonctionne sans problème

C'est parce que vous ne l'avez pas testé beaucoup.

Je ne suis pas tout à fait certain ce que "une sélection d'image a lieu avec le gestionnaire de fichiers" signifie. Peu importe, votre cassé getRealPathFromURI_API19() suppose que ce soit:

  • Si vous query() le Uri et rentreras null, puis getPath() est un chemin de système de fichiers. Il n'y a aucune exigence pour que ce soit le cas. Par exemple, le Uri peut être servi par un ContentProvider mais un qui n'implémente pas query(). Ou, il pourrait s'agir d'un schéma android.resource (que divers développeurs essaient).Les deux représentent des bogues de la part de l'expéditeur, mais votre application échouera toujours.

  • Si vous query() le Uri et obtenir un retour Cursor, ce curseur aura une colonne MediaStore.Images.ImageColumns.DATA. Il n'y a aucune exigence pour que ce soit le cas. FileProvider, par exemple, ne le fait pas.

  • Si vous query() le Uri et obtenir un retour Cursor, et il y a une colonne non nullDATA, qu'il représente un chemin de système de fichiers que vous pouvez utiliser. Il n'y a aucune exigence pour que ce soit le cas. Par exemple, le chemin peut être vers des fichiers sur un stockage amovible auquel vous n'avez pas accès directement via le système de fichiers.

Heureusement, en utilisant openInputStream() adresses toutes celles-ci, comme cela en utilisant une bibliothèque image de chargement bien entretenu.