内部存储(即用户不能访问的空间,外部存储指存储可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储,详情看下面链接)
在manifest声明了shareUserId = "android.uid.system"的是不用申请外部存储permission的,但是不可以写SD卡,只能读,可以写自带(不可移除)的存储空间.
一般的应用需要读写外部存储器的话需要动态使用permission,这是从android M开始的.
mImageFilePath可以是外部存储器的路径
mImageFilePath = new File(mScreenshotDir, mImageFileName).getAbsolutePath();
// Create the large notification icon
mImageWidth = longscreenshotbitmap.getWidth();
mImageHeight = longscreenshotbitmap.getHeight();
long dateSeconds = mImageTime / 1000;
ContentValues values = new ContentValues();
ContentResolver resolver = mContext.getContentResolver();
values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);//
values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);//
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);//
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);
values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png");
values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);
values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri == null) {
sendMyMessage(mHandler, MESSAGE_FAIL_TO_SAVE_PIC);
return;
}else {
Tools.log(TAG, " uri != null");
}
try {
resolver.update(uri, values, null, null);
OutputStream out = resolver.openOutputStream(uri);
if(out == null){
sendMyMessage(mHandler, MESSAGE_FAIL_TO_SAVE_PIC);
return;
}
boolean bCompressOK = longscreenshotbitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
Tools.log(TAG, " bCompressOK ==" +bCompressOK);
out.flush();
out.close();
// update file size in the database
values.clear();
values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
int updateFileSizeResult = resolver.update(uri, values, null, null);