Andoridは写真をアルバムに保存する機能を実現

3839 ワード

Andoridは写真をアルバムに保存する機能を実現し、ネット上で解決策を見つけることができるのは一般的に方法の一つだが、実際のテストでは、方法の一つに問題があることが分かった.実現方法一:
public static void saveImageToGallery(Context context, Bitmap bmp) {
    //  
    File appDir = new File(Environment.getExternalStorageDirectory(), "images");
    if (!appDir.exists()) {
        appDir.mkdir();
    }
    String fileName = “myImage” + ".jpg";
    File file = new File(appDir, fileName);
    try {
        FileOutputStream fos = new FileOutputStream(file);
        bmp.compress(CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    //  
    try {
        MediaStore.Images.Media.insertImage(context.getContentResolver(),
                file.getAbsolutePath(), fileName, null);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    //  
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
}

1、一部の携帯電話のアルバムは数分待ってから画像を見ることができます.例えば、赤米NOTE 3 2、ライブラリには2枚の画像が存在し、1枚は保存された「imgaes/myImgae.jpg」、もう1枚はシステムライブラリinsertImage()メソッドを挿入して生成された画像であり、通常は「システム時間.jpg」である.まずアルバムに出てくるのは後ろの写真です.後で最初の写真もアルバムに表示されます.3、insertImage()メソッド赤米NOTE 3携帯電話でこの異常を投げ出す:MediaStore:Failed to insert image java.io.FileNotFoundException: No such file or directory at android.database.DatabaseUtils.r a d M e c e p t i o n W i t h F i l e N o t FoundExceptionFromParcel(DatabaseUtils.java:146)実装方法2:テスト実行可能.画像は1枚しか保存されておらず、アルバムですぐに見ることができます.
 public void saveImageToGallery(Bitmap bmp) {
        //  
        File appDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = "myImage.jpg";
        final File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 
        if (file != null && file.length() > 0) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    MediaScannerConnection.scanFile(
                            mContext,
                            new String[]{file.getAbsolutePath()},
                            null,
                            new MediaScannerConnection.OnScanCompletedListener() {
                                @Override
                                public void onScanCompleted(String path, Uri uri) {
                                    handler.sendEmptyMessage(0);
                                }
                            });
                }
            }).run();
        }
    }

Handle定義
    private static Handler handler=new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(mContext," !",Toast.LENGTH_SHORT).show();
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            mContext.startActivity(intent);
        }
    };

方式2と方式1の違い:1、方式2携帯電話システムの画像経路の下に画像を直接保存する2、画像ライブラリの更新方法が異なる
備考:方式1のライブラリ更新方法も正しいが、uriを取得する方法はUriに変更する必要がある.fromFile(file)です.そうしないと、方法1の2つ目の問題になります(アルバムに画像が表示されるまでしばらくかかります).
 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));