Android 10 及更高版本的 Scoped Storage 应用程序崩溃,将图像上传到服务器

问题描述

我正在尝试使用改造将图片从图库或相机上传到服务器。
我的应用程序在 android 10 之前运行良好,我选择了使用范围存储,

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,validation_split=0.2,subset="validation",seed=121,image_size=(img_height,img_width),batch_size=batch_size)

但是在 android 11 中它被删除了所以我应该做些什么来修复范围存储的错误

android:requestLegacyExternalStorage="true"

显示对话框以选择厨房或相机

 2021-02-13 15:46:39.335 13981-13981/com.nixbin.MeetNepali W/System.err: java.lang.IllegalStateException: Failed to build unique file: /storage/emulated/0/Pictures Title image/jpeg
2021-02-13 15:46:39.337 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.os.Parcel.createException(Parcel.java:2079)
2021-02-13 15:46:39.337 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.os.Parcel.readException(Parcel.java:2039)
2021-02-13 15:46:39.337 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
2021-02-13 15:46:39.337 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
2021-02-13 15:46:39.337 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.content.ContentProviderProxy.insert(ContentProviderNative.java:495)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.content.ContentResolver.insert(ContentResolver.java:1854)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.provider.MediaStore.createPending(MediaStore.java:627)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.provider.MediaStore$Images$Media.insertimage(MediaStore.java:1802)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at com.nixbin.MeetNepali.application.MyApplication.getimageUri(MyApplication.java:280)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at com.nixbin.MeetNepali.fragments.discussionFragment.onActivityResult(discussionFragment.java:295)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at androidx.fragment.app.FragmentActivity.onActivityResult(FragmentActivity.java:170)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:8140)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:4969)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:5017)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2123)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:107)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.os.Looper.loop(Looper.java:214)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7710)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
2021-02-13 15:46:39.338 13981-13981/com.nixbin.MeetNepali W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

设置图片路径功能

public void uploadImageTypePost() {
   //set image path
    setimagepath();
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            getActivity());

    // set title
    alertDialogBuilder.setTitle("Choose option");

    // set dialog message
    alertDialogBuilder
            .setMessage("Please select image from ")
            .setCancelable(false)
            .setPositiveButton("Camera",(dialog,id) -> {
                        dialog.cancel();
                        if (hasCameraPermission()) {
                            takePicture();
                        } else {
                            requestCameraPermission();
                        }
                    })
            .setNegativeButton("gallery",id) -> {
                        if (hasgalleryPermission()) {
                            opengallery();
                        } else {
                            requestgalleryPermission();
                        }

                    });

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    alertDialog.setCancelable(true);
    // show it
    alertDialog.show();
}

打开图库

private void setimagepath() {

    String fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".jpg";
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        File sdIconStorageDir = new File(Environment.getExternalStorageDirectory() + "/" + "Pictures/");
        // create storage directories,if they don't exist
        sdIconStorageDir.mkdirs();

        mFileTemp = new File(Environment.getExternalStorageDirectory() + "/" + "Pictures/",fileName);
    } else {
        mFileTemp = new File(getActivity().getFilesDir(),fileName);
    }
}

拍照

    private void opengallery() {
    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent,REQUEST_CODE_galLERY);
}

关于活动结果

private void takePicture() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        Uri mImageCaptureUri = null;
        String state = Environment.getExternalStorageState();
        mImageCaptureUri = FileProvider.getUriForFile(getContext(),BuildConfig.APPLICATION_ID + ".provider",mFileTemp);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,mImageCaptureUri);
        intent.putExtra("return-data",true);
        startActivityForResult(intent,REQUEST_CODE_TAKE_PICTURE);
    } catch (ActivityNotFoundException e) {
        Log.d("","cannot take picture",e);
    }
}

获取路径

@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if (requestCode == REQUEST_CODE_galLERY && resultCode == RESULT_OK) {
        try {

            final Uri imageUri = data.getData();
            final InputStream imagestream = getActivity().getContentResolver().openInputStream(imageUri);
            final Bitmap selectedImage = BitmapFactory.decodeStream(imagestream);
            Bitmap resized = Bitmap.createScaledBitmap(selectedImage,500,true);
            filepath = getPath(getActivity(),getimageUri(getActivity(),resized));
            Utils.loadImageRound(getActivity(),profileImage,filepath);
            Log.d(TAG,"onActivityResult: " + filepath);


            //Absolute Path

        } catch (FileNotFoundException e) {
            e.printstacktrace();
            Toast.makeText(getActivity(),"PickUp image failure",Toast.LENGTH_SHORT).show();
        }

    } else if (requestCode == REQUEST_CODE_TAKE_PICTURE && resultCode == RESULT_OK) {
        try {
            filepath = mFileTemp.getAbsolutePath();
       
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),Uri.fromFile(new File(mFileTemp.getAbsolutePath())));
            Bitmap resized = Bitmap.createScaledBitmap(bitmap,true);
            System.out.println("image width" + resized.getWidth() + " image height" + resized.getHeight());
            filepath = getPath(getActivity(),resized));

            filepath = getPath(getActivity(),filepath);

            Log.d(TAG,"onActivityResult: " + filepath);
        } catch (Exception e) {
            System.out.println("exception...." + e.toString());
        }
  } else {
//            Toast.makeText(mActivity,"Permission Denied Goto Settings and allow storage and camera permission",Toast.LENGTH_SHORT).show();
        }
    }

提前感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)