Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.NullPointerException:接收图像sd卡路径时的URI字符串_Android - Fatal编程技术网

Android java.lang.NullPointerException:接收图像sd卡路径时的URI字符串

Android java.lang.NullPointerException:接收图像sd卡路径时的URI字符串,android,Android,此错误的原因是什么: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.sqlfirst.AddImage}: java.lang.NullPointerException: uriString 错误指向我接收意图的这条线 img.setImageURI(Uri.parse(imagePath )); 我正试图通过一个意图向另一个活动发送一个sd卡路径,并将其

此错误的原因是什么:

 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();

您正在将
imagepath
设置为额外设置,并尝试检索
imagepath


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

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

下面是创建Uri的代码,将其传递给您的意图。获得结果后,可以使用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:

要将文件转换为位图,可以使用中@nikhilleddy Gujjula提供的代码


setimageuri()
是从..建议的。。我已经在使用毕加索了,但是我在缩小图像尺寸方面遇到了问题。他们解释了如何从SD卡获取图像路径并将其发送到另一个活动,然后减小其大小,这有什么答案吗?@Moudiz加载图像时,您可以通过调用其fit()方法来减小毕加索支架内图像的大小。@Angmar我这样做了,但其大小仍然为200kb,我想在不降低很多质量的情况下将图像缩小到50kb或更小,然后尝试Universal File Loader,我认为它实际上会将图像缩小到所需的大小…或者你可以自己做,这里有一个教程@Angmar这是我关于毕加索的问题,我会浏览你的评论,但是你能帮我把路径图像发送到另一个目的地并转换成位图吗?一个SO链接会很有帮助,非常好。有没有可能为我解释一下如何从另一个活动获取uri并将其转换为图像?你的帮助真的很奇怪,但我有一个后端常量无法解决的问题variable@Moudiz抱歉,编辑了答案,这是您放置文件的目录名的地方谢谢,附带问题onactivityresul和您的类有什么不同?如果我可以用你的方式来做,为什么要使用onactivityresult?你仍然需要使用onactivityresult,但你需要创建一个文件,以便有地方放置你的文件:无论是图像、视频还是你需要的任何东西
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);
selected_photo.setImageBitmap(bitmap);