3

Galaxy Nexus は現在 Android 4.3 で実行されているため、この新しいバージョンでアプリケーションをテストできます。トリミング以外はすべて問題ないようです。

カメラを使用して写真を撮り、ギャラリーアプリで画像をトリミングするアプリケーションがあります。

ギャラリーから写真を選択してトリミングすることもできます。Android 4.3 から、ギャラリー アプリが変更されました。

カメラ API で写真を撮り、ギャラリーにonActivityResult メソッドでトリミングするように依頼すると、resultCode は 0 (キャンセルを意味する) に設定されますが、トリミング ビューから [保存] をクリックします。

しかし、ギャラリーから画像を選択してトリミングすると、すべてが機能し、resultCode パラメータが -1 に設定されます。どちらの場合も、同じメソッドを呼び出して画像をトリミングします。

私の携帯電話にはquickpic(ギャラリーアプリの代替)があり、すべてが機能しています!

private void performCrop(Uri picUri) {
    try {
        int aspectX = 750;
        int aspectY = 1011;

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(picUri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("scale", "true");
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        intent.putExtra("scaleUpIfNeeded", true);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentPhotoPath)));

        startActivityForResult(intent, CROP);
    }
    catch (ActivityNotFoundException anfe) {
        String errorMessage = "Your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

Android 4.2.2 ではすべて正常に動作しました。ご協力ありがとうございました !

4

3 に答える 3

3

次のようなライブラリを使用することを検討しましたか:

https://github.com/biokys/cropimage

com.android.camera.action.CROP は電話によって動作が異なる場合があり、常に利用できるとは限らないため、リリースしようとしている場合はとにかく問題が発生する可能性があります。

アップデート:

上記のライブラリを Android 4.3 でテストしましたが、問題なく動作します。ライブラリをプロジェクトに追加するだけです。

その後、非常によく似た方法でメソッドを記述できます。

private void performCrop(Uri picUri) {
//you have to convert picUri to string and remove the "file://" to work as a path for this library
String path = picUri.toString().replaceAll("file://", "");

try {
    int aspectX = 750;
    int aspectY = 1011;

    Intent intent = new Intent(this, CropImage.class);
    //send the path to CropImage intent to get the photo you have just taken or selected from gallery
    intent.putExtra(CropImage.IMAGE_PATH, path);

    intent.putExtra(CropImage.SCALE, true);

    intent.putExtra("aspectX", aspectX);
    intent.putExtra("aspectY", aspectY);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentPhotoPath)));

    startActivityForResult(intent, CROP);
}
catch (ActivityNotFoundException anfe) {
    String errorMessage = "Your device doesn't support the crop action!";
    Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
    toast.show();
}

}

于 2013-07-29T23:51:26.427 に答える
3

上記のライブラリは、非常に小さな画像にトリミングする場合にのみ役立ちます。より高い解像度の画像にトリミングする場合は、Android Crop Intent を使用することをお勧めします。

picUri は画像を指す有効な URI である必要があり、outputUri はトリミングされた画像を書き込むために作成した新しいファイルである必要があります。それはすべてのデバイスで動作し、4.3 ソース コードには実際に使用可能な com.android.camera.action.CROP インテントがあります。これを多くのデバイスでテストしましたが、うまく機能します。

private void performCrop(Uri picUri, Uri outputUri) {
    try {
        int aspectX = 2000;
    int aspectY = 1200;

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(picUri, "image/*");
        intent.putExtra("scale", "true");
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        intent.putExtra("scaleUpIfNeeded", true);
        intent.putExtra("return-data", false);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);

        startActivityForResult(intent, CROP);
    }
    catch (ActivityNotFoundException anfe) {
        String errorMessage = "Your device doesn't support the crop action!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}
于 2013-10-17T19:02:10.360 に答える
1

Nexus 10 でもこの問題が発生しました。クロップ インテントはキャンセルされたコードを返します。いくつかの調整の後、私は解決策を見つけました:

私の場合、設定された入力ファイルは、エクストラsetDataAndType()を使用して設定された出力と同じファイルでした。MediaStore.EXTRA_OUTPUT入力と出力に同じファイルを使用すると、ほとんどのデバイス、特に 4.3 未満のデバイスで問題なく動作しました。ただし、4.3 では作物がキャンセルされます。入力と出力に異なるファイルを使用するだけで、問題は解決しました。

したがって、確認する必要があるのは、picUriパラメーターが .xml とは異なるファイルを指していることですmCurrentPhotoPath。4.2 から 4.3 への正確な変更が原因でこの問題が発生したかどうかはわかりません。しかし、別のファイルを使用すると、簡単に解決できるようです。

于 2013-10-29T12:39:11.893 に答える