【问题标题】:Upload image to server from android Api 23 and above从 android Api 23 及更高版本将图像上传到服务器
【发布时间】:2016-12-20 05:10:21
【问题描述】:

我希望我的应用从 Android 库中挑选一张图片并将其上传到服务器上。该代码在 API lenel 22 即棒棒糖上运行良好。但是在 API 级别 23 上出现 NullPointerException 失败。 API 23 之后有什么变化吗?如果有,那是什么。

这是我使用的代码。

 public void onClickAddProfileImage(View v) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(intent, PICK_PROFILE_PHOTO);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_PROFILE_PHOTO && resultCode == Activity.RESULT_OK) {
            uploader.setVisibility(View.VISIBLE);
            Uri selectedImage = data.getData();
            String[] projection = {MediaStore.Images.Media.DATA};
            CursorLoader loader = new CursorLoader(this, selectedImage, projection, null, null, null);
            Cursor cursor = loader.loadInBackground();
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            Uri imageUri = Uri.parse(cursor.getString(column_index));
            cursor.close();
            Intent in = new Intent();
            UploadFile file_upload = new UploadFile(this, in);
            file_upload.execute();
        }
    }

还有我上线的错误日志

Uri imageUri = Uri.parse(cursor.getString(column_index));

     Process: com.webkul.taskapp, PID: 2648  java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:205520 flg=0x1 }} to activity {com.webkul.taskapp/com.webkul.taskapp.BaseActivity}: java.lang.NullPointerException: uriString
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3720)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3763)
        at android.app.ActivityThread.-wrap16(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
     Caused by: java.lang.NullPointerException: uriString
        at android.net.Uri$StringUri.<init>(Uri.java:475)
        at android.net.Uri$StringUri.<init>(Uri.java)
        at android.net.Uri.parse(Uri.java:437)
        at com.webkul.taskapp.BaseActivity.onActivityResult(BaseActivity.java:535)
        at android.app.Activity.dispatchActivityResult(Activity.java:6442)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3716)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3763) 
        at android.app.ActivityThread.-wrap16(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5443) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)     
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

请任何人提出解决问题的任何建议。

【问题讨论】:

  • 所以光标==null。或 cursor.getString() ==null。如果您在使用前检查,您将不会有该异常。
  • selectedImage 的类型是什么?
  • Uri imageUri。你没有使用imageUri
  • @greenapps cursor.getString(column_index) 为空,我每次都得到 column_insex=0。
  • 也许它具有权限。您是否要求用户授予访问文件的权限?好吧,在 23+ api 中你需要请求权限,然后只有你可以访问文件。

标签: android file-upload


【解决方案1】:

使用大量代码,您正试图从……一个 Uri 构造一个 Uri。

data.geData() 已经是 Uri,您可以使用它打开 InputStream 以上传文件。

【讨论】:

  • 不,即使在棒棒糖版本中,我也无法将我通过 data.getData() 获得的 Uri 与 FileInputStream 一起使用。 fileInputStream = new FileInputStream(selectedImage.getPath()); 它给出了 FileNotFoundException。
  • 你不应该使用 FileInputStream;我说InputStream。更改为InputStream is = getContentResolver().openInputStream(data.getData());
  • 您能否分享一个博客链接、要点或任何相关示例。
  • 为什么。?你有什么问题?将该语句直接放在 onActivityResult() 中进行测试(作为第一条语句),并报告它是否打开流而没有异常。对于其余部分,您的上传代码完全相同。只需将 FileInputStream 更改为 InputStream。
【解决方案2】:

我遇到了这个问题,但通过使用这个第三方库解决了它
https://github.com/sangcomz/FishBun

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2015-03-29
    • 2011-10-15
    • 2020-11-19
    相关资源
    最近更新 更多