我希望当用户注册我的应用程序时,他可以拍照或从图库中选择他的照片以便在应用程序中使用。 我想将这张图片保存在内部app文件夹中,这样我就不需要请求存储权限了(我想!)。 我无法做到这一点。 现在,我有图像的Uri。 我怎么能这样做?
答案 0 :(得分:2)
您可以从Bitmap
获取URI
并保存到本地存储空间。从Bitmap
获取:
public static Bitmap getBitMap(Uri uri) throws FileNotFoundException, IOException{
InputStream input = this.getContentResolver().openInputStream(uri);
BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
onlyBoundsOptions.inJustDecodeBounds = true;
onlyBoundsOptions.inDither=true;//optional
onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
input.close();
if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) {
return null;
}
int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;
double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
bitmapOptions.inDither = true; //optional
bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//
input = this.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
input.close();
return bitmap;
}
private static int getPowerOfTwoForSampleRatio(double ratio){
int k = Integer.highestOneBit((int)Math.floor(ratio));
if(k==0) return 1;
else return k;
}
然后称之为:
Bitmap bitmap = getBitMap(imageUri);
然后将位图保存到内部存储中,创建一个类ImageStorage
:
public class ImageStorage {
public static String saveInternalStorage(Context context,Bitmap bitmap, String filename) {
String stored = null;
File sdcard = context.getFilesDir();
File folder = new File(sdcard.getAbsoluteFile(), "/directoryName/");
folder.mkdir();
File file = new File(folder.getAbsoluteFile(), filename + ".jpg") ;
if (file.exists())
return stored ;
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
stored = "success";
} catch (Exception e) {
FirebaseCrash.report(e);
e.printStackTrace();
}
return stored;
}
public static File getImage(Context context,String imagename) {
File mediaImage = null;
try {
String root = context.getFilesDir().toString();
File myDir = new File(root);
if (!myDir.exists())
return null;
mediaImage = new File(myDir.getPath() + "/directoryName/"+imagename);
} catch (Exception e) {
FirebaseCrash.report(e);
// TODO Auto-generated catch block
e.printStackTrace();
}
return mediaImage;
}
public static boolean checkifImageExists(Context context,String imagename)
{
Bitmap b = null ;
File file = ImageStorage.getImage(context,"/"+imagename+".jpg");
String path = file.getAbsolutePath();
if (path != null)
b = BitmapFactory.decodeFile(path);
if(b == null || b.equals(""))
{
return false;
}
return true ;
}
}
之后使用您的活动Context
调用该函数。
答案 1 :(得分:0)
如果您将个人资料图片保存到存储空间,那么您需要具有读写权限。
如果您在问题中提到的话,如果您在本地使用图像,我认为将图像存储在不同的文件夹中并不是一个好主意。
但是,
如果您想在不要求存储权限的情况下执行此操作,则可以将当前图像URI(您正在获取)存储到 SharedPreferences 中,并使用已保存的URI显示配置文件图像。
示例:
在您的班级中声明SharedPrefrence:
SharedPreferences sharedpreferences;
public static String MYPREFERENCES="MyPrefs";
在onCreate()中初始化SharedPrefrence:
sharedpreferences = getSharedPreferences(MYPREFERENCES, 0);
使用此共享优势来处理图像URI并将uri保存在此。
示例:
Uri imgUri = Uri.parse("content://x.y.z/"); // Use your URI
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("ProfileImageUri",imgUri);
editor.apply();
现在从sharedprefrence中检索此URI,您要在其中设置或显示用户配置文件图片
示例:
Uri defaultImageUri = Uri.parse("android.resource://my.package.name/"+R.drawable.profileimage); // use this default image uri if user didn't saved any image to sharedprefrence .
sharedpreferences = getSharedPreferences(MYPREFERENCES, 0);
ImageURI= sharedpreferences.getString("ProfileImageUri", defaultImageUri.toString);
现在,
Uri imgUri = Uri.parse(ImageURI);
imageView.setImageURI(imgUri);