【问题标题】:Failure delivering result to activity while getting image from camera in Android 7.1在 Android 7.1 中从相机获取图像时无法将结果传递给活动
【发布时间】:2018-04-14 21:32:58
【问题描述】:

在 Android 7.1 中从相机获取图像时将结果 ResultInfo{who=null, request=3, result=-1, data=null} 传递给 Activity 失败

我正在尝试从我的相机意图中获取和成像,但在尝试从我的 Uri 获取路径时遇到了错误,因为我需要将文件上传到我的服务器的路径。

这是我的代码

  public String getRealPathFromURI(Uri uri) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        return cursor.getString(idx);
    }

public String getPath(Uri uri) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            String document_id = cursor.getString(0);
            document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
            cursor.close();

            cursor = getContentResolver().query(
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
            cursor.moveToFirst();
            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            cursor.close();
        }


        return path;
    }



  public void startCamera() {
        Intent callCameraApplicationIntent = new Intent();
        callCameraApplicationIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

        File photoFile = null;
        try {
            photoFile = createImageFile();

        } catch (IOException e) {
            e.printStackTrace();
        }

        String authorities = getApplicationContext().getPackageName() + ".provider";
        currentImageUri = FileProvider.getUriForFile(this, authorities, photoFile);
        callCameraApplicationIntent.putExtra(MediaStore.EXTRA_OUTPUT, currentImageUri);
        callCameraApplicationIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        callCameraApplicationIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(callCameraApplicationIntent, CAMERA_REQUEST);

    }



protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == GALLERY_PICTURE && resultCode == RESULT_OK && data != null && data.getData() != null) {
            try {
                filePath = data.getData();
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy-hh-mm-ss");
                String format = simpleDateFormat.format(new Date());
                storedImagePath = tempFileImage(this, bitmap, "name" + format);
                uploadMultipart();

            } catch (IOException e) {
                e.printStackTrace();
            }

        } else if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {

            filePath = currentImageUri;
            uploadMultipart();


        }
}

最后加载到服务器

   public void uploadMultipart() {
        //getting name for the image
        String path = "";

        String name = messageET.getText().toString().trim();
        //getting the actual path of the image


        if (currentImageUri != null) {
//            path = getPath(currentImageUri);
            path = getRealPathFromURI(currentImageUri);
        }
        if (filePath != null) {
            path = getPath(filePath);
        }


        try {
            String uploadId = UUID.randomUUID().toString();
            String uploadUrl = "https://app.aer.media/v2/message_router/_sendMessage";

            //Creating a multi part request
            new MultipartUploadRequest(this, uploadId, uploadUrl)
                    .addFileToUpload(path, "mediaFile") //Adding file
                    .addParameter("data[message]", name) //Adding text parameter to the request
                    .addParameter("data[user_data]", k) //Adding text parameter to the request
                    //                    .setNotificationConfig(new UploadNotificationConfig())
                    .setMaxRetries(2)
                    .startUpload(); //Starting the upload
//            getConvoData(k, "", "", false);
//            rv_convo.getAdapter().notifyItemInserted(convobeans.size() - 1);

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

            ConvoResponseModel.DataBean.ConversationBean.MediaFileBean mf = new ConvoResponseModel.DataBean.ConversationBean.MediaFileBean();

            mf.setImage(null);
            mf.setThumb(null);
            mf.setBitmap(bitmap);
            long time = new Date().getTime() / 1000;


            ConvoResponseModel.DataBean.ConversationBean conversationBean = new ConvoResponseModel.DataBean.ConversationBean();
            conversationBean.setMessage("");
            conversationBean.setIs_me(1);
            conversationBean.setTime(String.valueOf(time));
            conversationBean.setMediaFile(mf);

            adapter.addItem(conversationBean);
//            adapter.notifyItemInserted(convobeans.size - 1);


        } catch (Exception exc) {
        }
    }

我可以在完全相同的路径上查看从我的文件管理中保存的图像,但是当我尝试将图像上传到服务器并调用它的 getpath() 时,它会引发错误

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: media.aer.influencer, PID: 24847
                                                                      java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=null} to activity {media.aer.influencer/media.aer.influencer.Activity.ChatDetailsActivity}: android.database.CursorIndexOutOfBoundsException: Requested column: -1, # of columns: 2
                                                                          at android.app.ActivityThread.deliverResults(ActivityThread.java:4257)
                                                                          at android.app.ActivityThread.handleSendResult(ActivityThread.java:4300)
                                                                          at android.app.ActivityThread.-wrap20(ActivityThread.java)
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1588)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                          at android.os.Looper.loop(Looper.java:154)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6321)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                       Caused by: android.database.CursorIndexOutOfBoundsException: Requested column: -1, # of columns: 2
                                                                          at android.database.MatrixCursor.get(MatrixCursor.java:66)
                                                                          at android.database.MatrixCursor.getString(MatrixCursor.java:254)
                                                                          at android.database.CursorWrapper.getString(CursorWrapper.java:137)
                                                                          at media.aer.influencer.Activity.ChatDetailsActivity.getRealPathFromURI(ChatDetailsActivity.java:2787)
                                                                          at media.aer.influencer.Activity.ChatDetailsActivity.uploadMultipart(ChatDetailsActivity.java:2640)
                                                                          at media.aer.influencer.Activity.ChatDetailsActivity.onActivityResult(ChatDetailsActivity.java:2735)
                                                                          at android.app.Activity.dispatchActivityResult(Activity.java:7022)
                                                                          at android.app.ActivityThread.deliverResults(ActivityThread.java:4253)
                                                                          at android.app.ActivityThread.handleSendResult(ActivityThread.java:4300) 
                                                                          at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1588) 
                                                                          at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                          at android.os.Looper.loop(Looper.java:154) 
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6321) 
                                                                          at java.lang.reflect.Method.invoke(Native Method) 
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

【问题讨论】:

    标签: android android-camera-intent


    【解决方案1】:

    ACTION_IMAGE_CAPTURE 不返回 Uri,并且您的 getPath()/getRealPath() 代码无论如何也不起作用。

    你知道文件在哪里。您将其包含在EXTRA_OUTPUT 中。它被称为photoFile。保持这个值(包括将其保存为已保存的实例状态Bundle)并使用它。

    This sample app 展示了如何将FileProviderACTION_IMAGE_CAPTURE 结合使用。

    【讨论】:

    • 我正在使用文件提供程序来获取 uri currentImageUri = FileProvider.getUriForFile(this, authority, photoFile);
    • @MeshByAer:因此您的文件路径在变量photoFile 中表示。在onActivityResult() 中使用该值。
    • 所以我必须尝试从我的 onActivityResult 中的 photoFile 获取 uri ?
    • @MeshByAer:不。您的问题是“我需要将文件上传到我的服务器的路径”。该路径保存在photoFile 中。在onActivityResult() 中不需要Uri。你需要在onActivityResult() 中的photoFile。在我链接到的示例应用程序中,我的File 对象保存在活动的一个字段中,因此可以从onActivityResult() 获得。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2012-02-19
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多