【问题标题】:java.lang.NullPointerException: uriString when receiving image sd card pathjava.lang.NullPointerException: uriString 接收图片 sd 卡路径时
【发布时间】:2015-09-15 15:43:15
【问题描述】:

这个错误的原因是什么:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.sqlfirst.AddImage}: java.lang.NullPointerException: uriString

错误指向我收到意图的这一行

img.setImageURI(Uri.parse(imagePath ));

我正在尝试通过意图将 sd 卡路径发送到另一个活动并将其转换为图像 这是代码:

这里发送图片在sd卡中的路径

public   void openGallery() {

        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), 1);

        // startActivityForResult(
          // Intent.createChooser(intent, "Complete action using"),2);
       }

   protected void onActivityResult(int requestCode, int resultCode, Intent data) {

           super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) {

   Bundle extras2 = data.getExtras();

                filePath = data.getData();
  Intent i = new Intent(this,
                        AddImage.class);
  i.putExtra("imagepath", filePath);
 startActivity(i);

这里我想接收图像的路径并减小图像的大小。

    String imagePath = getIntent().getStringExtra("imagePath");
    ImageView img=(ImageView) findViewById(R.id.imageView);
    img.setImageURI(Uri.parse(imagePath ));

    Bitmap bitmap = ((BitmapDrawable)img.getDrawable()).getBitmap();
    Bitmap out = Bitmap.createScaledBitmap(bitmap, 500, 500, false); 
    // bitmap is the image 
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
   out.compress(Bitmap.CompressFormat.JPEG, 60, stream); 
   bitmap.recycle();

【问题讨论】:

    标签: android


    【解决方案1】:

    要正确使用路径,您应该首先创建它以便在某个地方存储它,您可以使用它,然后删除它或使用您获得的结果中的数据。

    这是创建 Uri 的代码,将其传递给您的 Intent。获得结果后,您可以使用 Uri 包中的 getPath 将 Uri 传递给另一个类。

    /**
             * Creating file uri to store image/video
             */
            public static Uri getOutputMediaFileUri() {
                return Uri.fromFile(getOutputMediaFile());
            }
    
        /**
         * returning image / video
         */
        private static File getOutputMediaFile() {
    
            // External sdcard location
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    "YOUR DIRECTORY NAME");
    
            // Create the storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d("image upload", "Oops! Failed create "
                            + "YOUR DIRECTORY NAME" + " directory");
                    return null;
                }
            }
    
            //TODO change naming
            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
            mediaFile = new File(mediaStorageDir.getPath() + File.separator
                    + "IMG_" + timeStamp + ".jpg");
            return mediaFile;
        }
    

    编辑 1:

    要将文件转换为位图,您可以使用此代码,由@Nikhilreddy Gujjula 在this question 中提供

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);
    selected_photo.setImageBitmap(bitmap);
    

    【讨论】:

    • 优秀..是否可以向我解释如何从另一个活动中获取 uri 并将其转换为图像?你的帮助真的很感激
    • 很奇怪,但我的 BackendConsts 无法解析为变量
    • @Moudiz 对不起,编辑了答案,那是您放置目录名称以放置文件的位置
    • 谢谢,附带问题 onactivityresul 和你的班级有什么不同?如果我能按照你的方式做到,为什么要使用 onactivityresult ?
    • 您仍然需要使用 onactivityresult,但您需要创建一个文件以便在某个地方放置您的文件:无论是图像、视频还是您需要的任何内容
    【解决方案2】:

    您将imagepath 设置为额外的并尝试检索imagePath

    还要注意setImageURI() 不是一个好的选择,因为它会在主应用程序线程上加载和解码图像。使用图片加载库,例如 Picasso 或 Universal Image Loader。

    【讨论】:

    • setimageuri() 是从user 建议的。我已经在使用毕加索,但我在减小图像大小时遇到​​问题。 SO中有没有答案,他们解释了如何从SD卡获取图像路径并将其发送到另一个活动然后减小其大小?
    • @Moudiz 您可以通过在加载图像时调用其 fit() 方法来减小 Picasso 支架内图像的大小。
    • @Angmar 我做到了,但它的大小仍然为 200kb,我想在不损失很多质量的情况下使其大小为 50kb 或更少
    • 那就试试Universal File Loader吧,我觉得它其实是把图片缩小到需要的大小了……或者你可以自己做,这里有教程stackoverflow.com/questions/23740307/…
    • @Angmar 这是我与毕加索stackoverflow.com/questions/32551633/… 相关的问题,我会仔细阅读您的评论,但是您能帮我如何将路径图像发送到另一个意图并将其转换为位图吗?一个 SO 链接会很有帮助
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2012-11-22
    • 2018-10-12
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多