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

标签 java android

我想允许用户在我的应用程序中上传个人资料图片,到目前为止我已经实现了这一点,但问题是当我退出应用程序时,个人资料图片消失了,所以我问是否有一种方法可以将图片存储在缓存我正在使用 glide 但不知道如何去做

更改我的 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();
            }
        }
    }
}

我希望即使在关闭应用程序后仍保留所选图像,我该怎么做,请输入

最佳答案

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

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

  2. 使用Room数据库。

下面是使用共享首选项的代码:

你的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();
    }

关于java - 如何创建允许永久上传/更改个人资料图片的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630482/

相关文章:

java - JPA 和 Hibernate 有什么区别?

java - Spring MongoDB : Aggregation first record base on date

android - 将android应用程序保存在sd卡中

java - 在 list 中声明 Google api key (对于 youtube API)

android - 当以前的证书将在 2033 年之前过期时更新 apk

c# - Xamarin.Android 重新部署应用程序不会更新程序集

java - 了解spring ldap中过滤器的含义

java - Adobe 体验管理器 6.2

java - 可嵌入的 Java HTTP 服务器

java - 线程中对象的速度不准确