如何创建允许个人资料图片永久上传/更改的应用

时间:2019-06-17 11:35:22

标签: java android

到目前为止,我想允许用户在我的应用程序中上传个人资料图片,但是问题是当我退出应用程序时,个人资料图片消失了,所以我问是否可以将图片存储在缓存我正在使用滑行,但不知道如何解决

在我的oncreate方法上默认更改加载,但仍然无效。

public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
public static final int REQUEST_IMAGE = 100;

@BindView(R.id.img_profile)
ImageView imgProfile;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(null);

    loadProfileDefault();



}

private void loadProfile(String url) {
    Log.d(TAG, "Image cache path: " + url);

    GlideApp.with(this).load(url)
            .into(imgProfile);
    imgProfile.setColorFilter(ContextCompat.getColor(this, android.R.color.transparent));
}

private void loadProfileDefault() {
    GlideApp.with(this).load(R.drawable.baseline_account_circle_black_48)
            .into(imgProfile);
    imgProfile.setColorFilter(ContextCompat.getColor(this, R.color.profile_default_tint));
}

@OnClick({R.id.img_plus, R.id.img_profile})
void onProfileImageClick() {
    Dexter.withActivity(this)
            .withPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    if (report.areAllPermissionsGranted()) {
                        showImagePickerOptions();
                    }

                    if (report.isAnyPermissionPermanentlyDenied()) {
                        showSettingsDialog();
                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).check();
}

private void showImagePickerOptions() {
    ImagePickerActivity.showImagePickerOptions(this, new ImagePickerActivity.PickerOptionListener() {
        @Override
        public void onTakeCameraSelected() {
            launchCameraIntent();
        }

        @Override
        public void onChooseGallerySelected() {
            launchGalleryIntent();
        }
    });
}

private void launchCameraIntent() {
    Intent intent = new Intent(MainActivity.this, ImagePickerActivity.class);
    intent.putExtra(ImagePickerActivity.INTENT_IMAGE_PICKER_OPTION, ImagePickerActivity.REQUEST_IMAGE_CAPTURE);

    // setting aspect ratio
    intent.putExtra(ImagePickerActivity.INTENT_LOCK_ASPECT_RATIO, true);
    intent.putExtra(ImagePickerActivity.INTENT_ASPECT_RATIO_X, 1); // 16x9, 1x1, 3:4, 3:2
    intent.putExtra(ImagePickerActivity.INTENT_ASPECT_RATIO_Y, 1);

    // setting maximum bitmap width and height
    intent.putExtra(ImagePickerActivity.INTENT_SET_BITMAP_MAX_WIDTH_HEIGHT, true);
    intent.putExtra(ImagePickerActivity.INTENT_BITMAP_MAX_WIDTH, 1000);
    intent.putExtra(ImagePickerActivity.INTENT_BITMAP_MAX_HEIGHT, 1000);

    startActivityForResult(intent, REQUEST_IMAGE);
}

private void launchGalleryIntent() {
    Intent intent = new Intent(MainActivity.this, ImagePickerActivity.class);
    intent.putExtra(ImagePickerActivity.INTENT_IMAGE_PICKER_OPTION, ImagePickerActivity.REQUEST_GALLERY_IMAGE);

    // setting aspect ratio
    intent.putExtra(ImagePickerActivity.INTENT_LOCK_ASPECT_RATIO, true);
    intent.putExtra(ImagePickerActivity.INTENT_ASPECT_RATIO_X, 1); // 16x9, 1x1, 3:4, 3:2
    intent.putExtra(ImagePickerActivity.INTENT_ASPECT_RATIO_Y, 1);
    startActivityForResult(intent, REQUEST_IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (requestCode == REQUEST_IMAGE) {
        if (resultCode == Activity.RESULT_OK) {
            Uri uri = data.getParcelableExtra("path");
            try {

                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);

                loadProfile(uri.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

即使关闭应用程序后,我仍希望保留所选图像,我该如何处理,请输入

2 个答案:

答案 0 :(得分:2)

有两种方法可以实现您的结果。

  1. 使用Shared Preferences。您可以将变量uri保存为共享首选项,并在下一次从中获取数据。为此,您可以检查uri中是否有Shared Preference

  2. 使用Room数据库库。

下面是使用Shared Preference的代码:

您的onCreate()如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(null);

    loadImageFromSharedPrefernce();
}

private void loadImageFromSharedPrefernce() {
        SharedPreferences prefs = getSharedPreferences("PREF_NAME", MODE_PRIVATE);
        if (prefs.contains("imageUrl")){
            String imageUrl = prefs.getString("imageUrl", "");
            loadProfile(imageUrl);    //your method

        }
        else {
            loadProfileDefault();      //your method
        }

    }

您的onActivityResult()就像:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (requestCode == REQUEST_IMAGE) {
            if (resultCode == Activity.RESULT_OK) {
                Uri uri = data.getParcelableExtra("path");
                try {
                    saveImageToSharedPreference(uri);
                    loadImageFromSharedPrefernce();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

private void saveImageToSharedPreference(Uri uri) {
        SharedPreferences.Editor editor = getSharedPreferences("PREF_NAME", MODE_PRIVATE).edit();
        editor.putString("imageUrl", String.valueOf(uri));
        editor.apply();
    }

答案 1 :(得分:0)

您应该在SharedPreference方法中接收的onActivityResult()中保存个人资料图片URI。在下面添加示例代码,看看。

private void saveProfilePicLocal(String uri){
    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
    Editor editor = pref.edit();
    editor.putString("profile_uri", uri); // Storing string
    editor.commit(); // commit changes
}

现在,您必须像下面这样在onActivityResult()方法中调用上述函数。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (requestCode == REQUEST_IMAGE) {
        if (resultCode == Activity.RESULT_OK) {
            Uri uri = data.getParcelableExtra("path");
            try {

                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                saveProfilePicLocal(uri.toString())
                loadProfile(uri.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在那之后,您应该检查是否在本地保存了任何配置文件,如果SharedPreference中存在任何URI,请读取它并加载,否则加载默认值。检查下面的示例代码。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(null);

    //Check whether profile pic URI exists in Local SharedPreference
    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0);
if (prefs.contains("profile_uri")){
        String uri = pref.getString("profile_uri", null);
        if(TextUtils.isEmpty(uri.trim())
          loadProfileDefault();
        else
          loadProfile(uri);
    }
}

编码愉快!。