保存图像,在Gallery App中显示

时间:2013-03-04 13:37:15

标签: android image gallery

我正在开发一个通过套接字接收多个图像的应用程序。为了保存它们,我写了以下方法:

public static boolean saveTempImageToGallery(Context c) {
    try {
        FileInputStream fis = c.openFileInput(Settings.TEMP_PHOTO_STORAGE);
        // create name of file: [date]-[time]-baby
        final String tFilename = new SimpleDateFormat("dd-MM-yyyy_hh-mm-ss")
                .format(new Date()) + ".png";

        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            Log.d(TAG, "External storage available.");
            // sd card available
            File dir = getExternalStorageDir("Photos");
            if (dir.mkdirs() || dir.isDirectory()) {
                Log.i(TAG, "Directory: "+dir.getAbsolutePath());
                File newImage = new File(dir, tFilename);
                if (newImage.createNewFile() && newImage.isFile()) {
                    Log.i(TAG, "Saving image to "+newImage.getAbsolutePath());
                    final Bitmap bmp = BitmapFactory.decodeStream(fis);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    // compress image to png
                    bmp.compress(Bitmap.CompressFormat.PNG, 40, baos);
                    FileOutputStream fo = new FileOutputStream(newImage);
                    fo.write(baos.toByteArray());
                    fo.close();
                    Log.i(TAG, "Image saved!");
                    return true;
                }
            } else {
                Log.d(TAG, "Could not create directory.");
            }
        } else {
            Log.d(TAG, "External storage not available.");
        }
    } catch (Exception e) {

    }
    return false;
}

public static File getExternalStorageDir() {
    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File(sdCard.getAbsolutePath() + "/"
            + Settings.EXT_STORAGE_DIRECTORY);
    return dir;
}

public static File getExternalStorageDir(String subdir) {
    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File(sdCard.getAbsolutePath() + "/"
            + Settings.EXT_STORAGE_DIRECTORY + "/" + subdir);
    return dir;
}

保存后,我想让用户可以在默认的图库应用中查看它们。在阅读了一些帖子后,我改编了以下代码:

MediaScannerConnectionClient mScanClient = new MediaScannerConnectionClient() {
            @Override
            public void onScanCompleted(String path, Uri uri) {
                try {
                    Log.d("onScanCompleted", uri + "success");
                    if (uri != null) {
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setData(uri);
                        startActivity(intent);
                    }
                } finally {
                    if (mScanCon != null)
                        mScanCon.disconnect();
                    mScanCon = null;
                }
            }

            @Override
            public void onMediaScannerConnected() {
                Log.i(TAG, "Media Scan Connected.");
                String[] files = Support.getExternalStorageDir("Photos")
                        .list();
                Log.i(TAG,
                        Support.getExternalStorageDir("Photos").list().length
                                + " elements in dir.");
                if (files.length > 0) {
                    for (String cur : files) {
                        if (cur.equals(".") || cur.equals(".."))
                            continue;
                        Log.i(TAG, "Using "
                                + cur
                                + " to scan stuff. "
                                + Support.getExternalStorageDir("Photos")
                                        .getAbsolutePath() + "/" + cur);
                        Log.i(TAG, "Not using "
                                + cur
                                + " to scan stuff. "
                                + Support.getExternalStorageDir("Photos")
                                        .toString() + "/" + cur);
                        mScanCon.scanFile(
                                Support.getExternalStorageDir("Photos")
                                        .getAbsolutePath() + "/" + cur,
                                "image/*");
                        break;
                    }
                } else {
                    Toast.makeText(getApplicationContext(),
                            "No images available.", Toast.LENGTH_LONG)
                            .show();
                }

            }
        };
        if (mScanCon != null)
            mScanCon.disconnect();
        mScanCon = new MediaScannerConnection(getApplicationContext(),
                mScanClient);
        mScanCon.connect();

奇怪的是:似乎onMediaScannerConnected从未被解雇 - 任何人都有想法?我一直在搜索网络和stackoverflow过去一小时..

谢谢。

1 个答案:

答案 0 :(得分:0)

您实际上无需连接到媒体扫描仪即可开始扫描,您可以使用this static method代替。

MediaScannerConnection.scanFile(context, new String[] {dir.getAbsolutePath()}, null, null);

修改

Uri uri = Uri.parse(filePath);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(uri, "image/*");
startActivity(i);