2015-09-15 39 views
1

这是什么错误的原因,当uriString中:显示java.lang.NullPointerException:接收图像的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卡路径通过意图到另一个灵活性,并将其转换成图像 这是代码:

这里发送的路径e在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(); 

回答

2

要正确使用路径,您应该首先创建它以在某处存储它,您可以使用它并稍后删除它或使用您得到的结果中的数据。

这里是创建一个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:

将文件转换为位图,你可以在this question

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

优秀..我可以解释为什么如何从其他活动获取uri并将其转换为图像?呃帮助ia真正apreciate – Moudiz

+0

@Moudiz更新了我的答案;) – Angmar

+0

谢谢你生病检查它现在 – Moudiz

1

要设置imagepath作为一个额外的,并试图找回imagePath

另请注意,setImageURI()不是一个好的选择,因为它会加载和解码主应用程序线程上的图像。使用图像加载库,如毕加索或通用图像加载程序。

+0

使用此代码,由@Nikhilreddy Gujjula提供'setimageuri()'从建议一个['用户'](http://stackoverflow.com/questions/32584648/how-to-send-from-onactivityresult-uri-path-to-another-activity-and-change-it-to/32585004?noredirect = 1#comment53029081_32585004)..我已经在使用毕加索,但我遇到问题作为图像的大小。是否有答案,在那里他们解释如何从SD卡中获取图像的路径并将其发送到另一个活动,然后减小其大小? – Moudiz

+0

@Moudiz您可以通过在加载图像时调用它的fit()方法来缩小毕加索持有人中图像的大小。 – Angmar

+0

@Angmar我做到了,它没有工作的大小仍然200kb,我想使它不超过50kb或更少的质量 – Moudiz