0

PHP を実行するサーバーからフォトスフィア イメージを取得しようとしています。ユニバーサル イメージ ローダー ライブラリを使用してイメージをフェッチします。そして、ビットマップを取得したら、それを SD カードに保存し、他のアクティビティで、ギャラリーを使用して光球の画像を開こうとします。問題は、画像を保存すると、6MB から 1MB 未満に圧縮されるため、ギャラリーが PhotoSphere 画像を開くことができないことです。これを解決する方法はありますか?(ビットマップをギャラリーに直接渡すことができるか、画像を非圧縮で保存する方法があるかどうか疑問に思っていました)

コード :

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
    .cacheInMemory(true).cacheOnDisk(true)
    .build();

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)
    .defaultDisplayImageOptions(defaultOptions)
    .build();

    ImageLoader.getInstance().init(config);
    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.displayImage(mHotelDetailResponseData.photosphere, mImage, defaultOptions, new ImageLoadingListener() {
        @Override
        public void onLoadingStarted(String imageUri, View view) {
        }
        @Override
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            Log.d("Test","fail : " + failReason.getCause().getMessage());
        }
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            Log.d("Test","complete");
            writeBitmapToMemory(loadedImage);
            mPhotoSphereButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("test","can continue");
                    Intent i = new Intent(getActivity(), PhotosphereActivity.class);
                    startActivityForResult(i,0);
                }
            });
        }
        @Override
        public void onLoadingCancelled(String imageUri, View view) {
        }
    }, new ImageLoadingProgressListener() {
        @Override
        public void onProgressUpdate(String imageUri, View view, int current, int total) {

            Log.d("Test","progress:" +current+"/"+total);
        }
    });

 private void writeBitmapToMemory(Bitmap bitmap) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg");
    try {
        f.createNewFile();
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());

        fo.close();
        Log.d("test","written to : " + Environment.getExternalStorageDirectory() + File.separator + "test.jpg");
    } catch (IOException e) {
        e.printStackTrace();
        Log.d("test","error : " + e.getMessage());
    }
}

ギャラリーでそれを開くインテントを送信するアクティビティ: (圧縮されていない光球を開くと正常に動作します)

public class PhotosphereActivity  extends BaseActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    startPanorama();
}

private void startPanorama() {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setComponent(new ComponentName("com.google.android.gms", "com.google.android.gms.panorama.PanoramaViewActivity"));
    intent.setDataAndType(Uri.parse(Environment.getExternalStorageDirectory() + File.separator + "test.jpg"), "image/*");
    startActivity(intent);
}
4

1 に答える 1

0

よし、やっとわかった。問題は、ギャラリーを使用して画像を開くときに、「image/*」だけでなく、インテント タイプを具体的に定義する必要があることです。

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        return;
    }
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.close();
        mPhotosphereFile = pictureFile;
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }
}
private  File getOutputMediaFile(){
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + mContext.getPackageName()
            + "/Files");

    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
    String mImageName="MI_"+ timeStamp +".png";
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
    Log.d("test","written to : " + mediaStorageDir.getPath() + File.separator + mImageName);

    return mediaFile;
}
于 2015-01-12T08:17:07.247 に答える