Android - 保存个人资料照片的位置和方式

时间:2017-09-05 10:48:33

标签: android

我希望当用户注册我的应用程序时,他可以拍照或从图库中选择他的照片以便在应用程序中使用。 我想将这张图片保存在内部app文件夹中,这样我就不需要请求存储权限了(我想!)。 我无法做到这一点。 现在,我有图像的Uri。 我怎么能这样做?

2 个答案:

答案 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);