图像保存到SdCard for 6.0.1 Android版

时间:2016-11-22 12:48:19

标签: android android-6.0-marshmallow android-sdcard

此代码在6.0.1 android版本下正常工作,但如果我在6.0.1 android设备上运行此应用程序,它将不会将图像保存到SD卡。 我需要为6.0.1设备更新什么?

public void SaveImages(int a ,String b)
        {
            Bitmap bitmap = null;
            OutputStream output;
            if(a==0)
            {
                bitmap = BitmapFactory.decodeResource(getResources(),
                        R.drawable.image_0);
            }



File filepath = Environment.getExternalStorageDirectory();

        // Create a new folder in SD Card
        File dir = new File(filepath.getAbsolutePath()
                + "/Wallpapers/");
        dir.mkdirs();

        // Create a name for the saved image
        File file = new File(dir,b);

        // Show a toast message on successful save
        Toast.makeText(FullImageActivity.this, "Loading...",
                Toast.LENGTH_SHORT).show();
        Toast.makeText(FullImageActivity.this, "Image Saved to SD Card",
                Toast.LENGTH_SHORT).show();
        try {

            output = new FileOutputStream(file);

            // Compress into png format image from 0% - 100%
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
            output.flush();
            output.close();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
        }

        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

2 个答案:

答案 0 :(得分:3)

在Android 6.0及更高版本中,您需要request runtime permission to write to external storage.

为了请求写入外部存储的运行时权限:

public class MarshmallowPermission {
    public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 2;

    public MarshmallowPermission() {
    }

    public boolean checkPermissionForExternalStorage(Activity activity) {
        if(Build.VERSION.SDK_INT >= 23) {
            int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if(result == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }

    public void requestPermissionForExternalStorage(Activity activity) {
        if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            Toast.makeText(activity,
                    "External Storage permission needed. Please allow in App Settings for additional functionality.",
                    Toast.LENGTH_LONG).show();
            // user has previously denied runtime permission to external storage
        } else {
            ActivityCompat.requestPermissions(activity,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
        }
    }
}

然后你可以做

if(!marshmallowPermission.checkPermissionForExternalStorage(this)) {
    marshmallowPermission.requestPermissionForExternalStorage(this);
} else {
    // can write to external
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == MarshmallowPermission.EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE) {
        if(marshmallowPermission.checkPermissionForExternalStorage(this)) {
            // can write to external
        } else {
            // runtime permission denied, user must enable permission manually
        }
    }
}

答案 1 :(得分:0)