【问题标题】:android: Bitmap decodeFile by filepath returns NullPointerExceptionandroid:按文件路径进行位图解码文件返回 NullPointerException
【发布时间】:2014-10-04 07:32:37
【问题描述】:

用户从图库中选择图片后,图片在 imageview imgview 中正确显示。代码如下:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100 && resultCode == Activity.RESULT_OK) 
        {
            adapter.clear();
            single_path = data.getStringExtra("single_path");
            imageLoader.displayImage("file://" + single_path, imgview);
            image_picked = true;
        } 
    }

    public void Upload_new_image() 
    {
        if (image_picked == true)
        {
            String imgFilePath = "file://" + single_path;
            Bitmap bitmap = BitmapFactory.decodeFile(""+imgFilePath);       
            ByteArrayOutputStream stream = new ByteArrayOutputStream();        
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);     // Line 156: NPE
            byte[] image = stream.toByteArray();

            ParseFile file = new ParseFile("upload.png", image);
            file.saveInBackground();
            ParseObject imgupload = new ParseObject("photo_database");
            imgupload.saveInBackground();
            Constants.custom_toast(this, "Image uploaded", "");         
        }
        else
        {
            Constants.custom_toast(this, "No image is picked!", "");
        }

Logcat:

10-04 15:18:31.926: W/dalvikvm(20254): threadid=1: thread exiting with uncaught exception (group=0x41c77700)
10-04 15:18:31.931: E/AndroidRuntime(20254): FATAL EXCEPTION: main
10-04 15:18:31.931: E/AndroidRuntime(20254): java.lang.NullPointerException
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.abc.app.activity.User_pick_image.Upload_new_image(User_pick_image.java:156)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.abc.app.activity.User_pick_image.onOptionsItemSelected(User_pick_image.java:93)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.app.Activity.onMenuItemSelected(Activity.java:2640)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:372)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1171)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:630)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:200)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.view.View.performClick(View.java:4475)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.view.View$PerformClick.run(View.java:18786)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.os.Handler.handleCallback(Handler.java:730)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.os.Looper.loop(Looper.java:137)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at android.app.ActivityThread.main(ActivityThread.java:5493)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at java.lang.reflect.Method.invokeNative(Native Method)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at java.lang.reflect.Method.invoke(Method.java:525)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
10-04 15:18:31.931: E/AndroidRuntime(20254):    at dalvik.system.NativeStart.main(Native Method)

问题:

虽然通过 imagerLoad.displayImage 方法可以在imgview 中正确显示图像,但当按下通过Upload_new_image() 方法上传图像时,无法获取到相同文件的相同文件链接并出现错误,如日志猫。

信息:

我通过挑选不同的图像获得了single_path的值,完整的值格式如下: /storage/emulated/0/Pictures/Screenshots/Screenshot_xxx.png

如何解决?

非常感谢!

【问题讨论】:

  • 第 156 行是哪个语句?哪个指针为空?请告诉该功能应该做什么。你没说。
  • 上面代码中标记的bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
  • 我怎么看出来的?您必须滚动才能看到它。
  • 忽略这个。正在检查 atm 的东西。
  • 去掉开头的“file://”,试试 File file = new File(path);然后是 file.exists() 或 file.isFile(),看看它们返回什么。还要验证文件路径是否具有图像扩展名,这些是确保 BitmapFactory.decodeFile 100% 工作的要求。如果上面返回 false,那么可能是路径有问题。

标签: android file bitmap bitmapfactory


【解决方案1】:
 String imgFilePath = "file://" + single_path;

应该是:

 String imgFilePath = single_path;

【讨论】:

  • 非常感谢! NPE不再弹出......我不知道以下是否是另一个问题,只是提一些细节:现在显示了吐司Image uploadedif循环完成,但Parse中没有显示图像数据库。 (确保解析设置正确,因为字符串中的图像标题等剩余信息(此处未显示)其他图像文件可以正确上传以进行解析)。总而言之,感谢您解决了第一个NPE问题!如果那么我应该将此标记为正确
【解决方案2】:

我不知道 single_path 的值是什么。也许你应该在 imgFilePath 之前添加“/”:

Bitmap bitmap = BitmapFactory.decodeFile("/"+imgFilePath);

【讨论】:

  • 谢谢...试过了,但仍然在同一行返回相同的 NPE 错误~
  • single_path 的值是通过挑选不同的图片得到的,完整的值格式如下:/storage/emulated/0/Pictures/Screenshots/Screenshot_xxx.png
【解决方案3】:

试试这个,像这样从数据意图中获取 Uri:

Uri contactUri = data.getData();

那么你应该从那个 Uri 获取你的绝对路径。

// 编辑 这可能会有所帮助:

public String getRealPathFromURI(Context context, Uri contentUri)
{
    Cursor cursor = null;
    try
    {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    finally
    {
        if (cursor != null)
        {
            cursor.close();
        }
    }
}

【讨论】:

  • 我知道,但我无法确认他是否有正确的路径,这就是我发布上述内容的原因。如果它仍然对他不起作用,那么他在其他地方崩溃,而不是在 fileDecode 方法中。
  • 他在 decodeFile() 中完全崩溃了。行。不会崩溃,但会返回 null。
【解决方案4】:

也可能是因为没有添加读取外部存储的运行时权限,这可能会导致此类错误。所以请从您的应用信息中的设置中检查是否授予了此权限。

注意: 您的应用设置可能禁用了需要启用的存储选项。

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多