【问题标题】:Unable to save cropped image - Android无法保存裁剪的图像 - Android
【发布时间】:2014-11-13 18:01:25
【问题描述】:

这是我从here得到的代码

    public class CatFragment extends Fragment implements OnClickListener{

        private DBCreater dbCreate;

        private static final int SELECT_PICTURE = 1;

        private String selectedImagePath = "android.resource://com.example.abcd/" + R.drawable.pets;
        private ImageView img;
        //private Button imgBtn;

        private Uri mCropImagedUri;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View gv = inflater.inflate(R.layout.new_pet, null);

            Spinner sp = (Spinner) gv.findViewById(R.id.ETPetType); 
            // get reference 
            sp.setAdapter(new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_spinner_dropdown_item, petType));

            Button btnSubmit = (Button) gv.findViewById(R.id.ButtonNext);
            btnSubmit.setOnClickListener(this);

            img = (ImageView)gv.findViewById(R.id.ImageView01);
        ((Button) gv.findViewById(R.id.ETPetImg))
                        .setOnClickListener(new OnClickListener() {
                            public void onClick(View arg0) {
                                try {
                                    Intent intent = new Intent();
                                    intent.setType("image/*");
                                    intent.setAction(Intent.ACTION_GET_CONTENT);
                                    intent.putExtra("crop", "true");
                                    intent.putExtra("aspectX", 0);
                                    intent.putExtra("aspectY", 0);
                                    intent.putExtra("outputX", 200);
                                    intent.putExtra("outputY", 200);
                                    intent.putExtra("return-data", false);

                                    File f = createNewFile("CROP_");
                                    try {
                                        f.createNewFile();
                                    } catch (IOException ex) {
                                        Log.e("io", ex.getMessage());
                                    }

                                    mCropImagedUri = Uri.fromFile(f);
                                    intent.putExtra(MediaStore.EXTRA_OUTPUT,
                                            mCropImagedUri);
                                    // start the activity - we handle returning in
                                    // onActivityResult
                                    startActivityForResult(intent, SELECT_PICTURE);
                                                            } catch (ActivityNotFoundException anfe) {
                                    // display an error message

                                }
                            }
                        });

                return gv;

            }


            private File createNewFile(String prefix){
                if(prefix==null || "".equalsIgnoreCase(prefix)){
                    prefix="IMG_";
                }
                File newDirectory = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.example.abcd/files/");
                if(!newDirectory.exists()){
                    if(newDirectory.mkdir()){
                        Log.d(this.getClass().getName(), newDirectory.getAbsolutePath()+" directory created");
                    }
                }
                File file = new File(newDirectory,(prefix+System.currentTimeMillis()+".jpg"));
                if(file.exists()){
                    //this wont be executed
                    file.delete();
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                return file;
            }


            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                if (resultCode == Activity.RESULT_OK) {
                    if (requestCode == SELECT_PICTURE) {
                        Uri selectedImageUri = data.getData();
                        selectedImagePath = getPath(selectedImageUri); //To get image path
                        System.out.println("Image Path : " + selectedImagePath);
                        img.setImageURI(selectedImageUri);


                    }
                }
            }

public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        //Cursor cursor = managedQuery(uri, projection, null, null, null);
        Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //access the database
        dbCreate = new DBCreater(getActivity());

    }



    @Override
    public void onClick(View v) {
        displayNextAlert();

    }

通过使用此代码,我可以裁剪图像,但它没有保存并返回 Toast 消息统计无法保存裁剪的图像。我在 LogCat 中看不到任何其他错误。请有人帮忙?提前致谢。

LogCat:

11-15 07:15:38.215: E/AndroidRuntime(27214): FATAL EXCEPTION: main
11-15 07:15:38.215: E/AndroidRuntime(27214): java.lang.RuntimeException: Unable to resume activity {com.example.abcd/com.example.abcd.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.abcd/com.example.abcd.MainActivity}: java.lang.NullPointerException
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2919)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2948)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2354)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.access$700(ActivityThread.java:159)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.os.Looper.loop(Looper.java:176)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.main(ActivityThread.java:5419)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at java.lang.reflect.Method.invokeNative(Native Method)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at java.lang.reflect.Method.invoke(Method.java:525)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at dalvik.system.NativeStart.main(Native Method)
11-15 07:15:38.215: E/AndroidRuntime(27214): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.abcd/com.example.abcd.MainActivity}: java.lang.NullPointerException
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3500)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2906)
11-15 07:15:38.215: E/AndroidRuntime(27214):    ... 12 more
11-15 07:15:38.215: E/AndroidRuntime(27214): Caused by: java.lang.NullPointerException
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1147)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.content.ContentResolver.query(ContentResolver.java:401)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.content.ContentResolver.query(ContentResolver.java:360)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at com.example.abcd.NewPetsFragment.getPath(NewPetsFragment.java:155)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at com.example.abcd.NewPetsFragment.onActivityResult(NewPetsFragment.java:143)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.Activity.dispatchActivityResult(Activity.java:5567)
11-15 07:15:38.215: E/AndroidRuntime(27214):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3496)
11-15 07:15:38.215: E/AndroidRuntime(27214):    ... 13 more

【问题讨论】:

  • 查看这篇帖子link的解决方案
  • 不,它不起作用,我认为这不是解决方案
  • 您的 Android 媒体是否无法安装(例如插入计算机的旧设备)无法写入外部存储?你有 WRITE_EXTERNAL_STORAGE 的权限吗?
  • @vinothkumar 在下面看到我的回答。我得到了工作的代码。在 Android 4.4.4 设备而非模拟器上测试。

标签: android image android-intent crop android-external-storage


【解决方案1】:

我通过更改保存的目录路径使代码工作如下:

 File newDirectory = new File(Environment.getExternalStorageDirectory()+"/test/");

原因:我无法保存到写保护目录“/Android/data/com.example.abcd/files/”

并通过对 onActivityResult 进行以下更改:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
        //    Uri selectedImageUri = data.getData();
        //    selectedImagePath = getPath(selectedImageUri); //To get image path

            selectedImagePath = mCropImagedUri.getPath(); //To get image path

            System.out.println("Image Path : " + selectedImagePath);
         //   img.setImageURI(selectedImageUri);


        }
    }
} 

注意:您可能不需要注释掉 img.setImageURI 行。我不得不出于测试目的。

确保您已在 AndroidManifest 中添加写入权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • 谢谢。希望这个能奏效。我会在测试后将其标记为正确答案。
  • @Wildroid:它解决了我的问题。但我想问你,是否有任何东西可以存储在 "/Android/data/com.example.abcd/files/" 中?此外,我的应用在裁剪和保存图像后崩溃。你能解决这个问题吗?我认为我需要为裁剪后的图像获取新路径。我该怎么做?
  • @vinothkumar 你是在设备还是模拟器上测试?注意:如果您保存到 sdcard/Android/data/full.package.name,裁剪的图像会在应用卸载时被删除。据我所知,您需要 root 权限才能保存到 Android 数据目录。
  • 谢谢。但是您给出的代码在保存裁剪后的图像后崩溃。我认为 onActivityResult 需要修改。我不知道怎么做。你能帮我解决一下吗?
  • @vinothkumar In OnActivityResult(): if(data!=null) { Bitmap thePic = (Bitmap) data.getExtras().get("data"); img.setImageBitmap(thePic); }
猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多