2017-08-30 7 views
-1

私はGoogle's guide Receiving Simple Data from Other Appsに続き、約束どおりにURLを取得することができました。私のアプリのアイコンは画像を共有するときに表示されています。他のアプリから受信した単純な画像データの解像度が0以下

しかし、具体的な問題は、これは、それがどのようになるで、そこにある:

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

handleSendImage(intent);

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);

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

0123につながるにつながるにつながります
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; 
} 

Bitmap.createBitmap

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

につながるしかし、私はまた、画像選択後に実行されるonActivityResult

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

のように見え、これがなく動作ファイルマネージャで行われてきました問題。

どこにエラーがありますか?

答えて

0

私はGoogleのガイドはありません他のアプリ

から単純なデータの受信後、あなたはしませんでした。そのガイドにはgetRealPathFromURI_API19()メソッドはありません。それは非常に良い理由です:それは一般的には機能しません。

ですので、削除してください。

代わりに、好きな画像読み込みライブラリを使用してUriから画像を読み込みます。または、最悪の場合、getContentResolver().openInputStream()を使用してUriで示されるコンテンツにInputStreamを取得し、そのストリームをBitmapFactory.decodeStream()に渡します。このI/Oをバックグラウンドスレッドで実行してください(他のメリットの中でも、画像読み込みライブラリが処理します)。

、これはあなたが非常にそれをテストしていないためである問題

せずに動作します。

"ファイルマネージャを使って画像を選択する"という意味はあまりありません。かかわらず、あなたの壊れgetRealPathFromURI_API19()はどちらかということを前提としています

  • あなたの場合query()Urinullを取り戻す、そしてgetPath()は、ファイルシステムのパスです。これに該当する必要はありません。たとえば、UriContentProviderで配信されますが、query()は配信されません。または、android.resourceスキーム(さまざまな開発者が試してみる)かもしれません。どちらも送信側のバグを表していますが、アプリはまだ失敗します。

  • あなたquery()UriCursorバックを取得する場合、そのカーソルはMediaStore.Images.ImageColumns.DATA列を持つことになります。これに該当する必要はありません。たとえば、FileProviderはこれを実行しません。

  • あなたquery()UriCursorバックを取得した場合、それはあなたが使用できるファイルシステムのパスを表していることを非nullDATA列は、そこにあります。これに該当する必要はありません。たとえば、ファイルシステム経由で直接アクセスできないリムーバブルストレージ上のファイルへのパスなどです。

openInputStream()を使用すると、十分に維持された画像読み込みライブラリを使用する場合と同じように、これらのすべてに対処することができます。

関連する問題