0

我试图获取用手机拍摄的照片的URI。我试图将传递给“onActivityResult”的数据转换为URI,然后将此URI转换为字符串以存储在我的数据库中。此方法适用于视频,因此如何通过照片实现这一点?当我尝试将数据转换为URI时,出现空指针异常。我应该使用不同的功能将照片数据转换为URI吗?我的代码如下:Android-如何获取拍摄的照片的阴影

按钮意图启动录像机:

recordVideoButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent startVideoFunction = new Intent(); 
      startVideoFunction.setAction(MediaStore.ACTION_VIDEO_CAPTURE); 
      startActivityForResult(startVideoFunction, REQUEST_CODE_VIDEO); 
     } 
    }); 

按钮意图启动照片拍摄:

takePhotosButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent startPhotoFunction = new Intent(); 
      startPhotoFunction.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(startPhotoFunction, REQUEST_CODE_PHOTO); 
     } 
    }); 

onActivityResult方法:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    try { 
     switch (requestCode) { 
      case REQUEST_CODE_VIDEO: 

       videoUri = data.getData(); 

       String videoPath = videoUri.toString(); 
       videoDB.addVideoRow(videoPath); 

       //displayVideo.setVideoURI(videoUri); 
       //displayVideo.start(); 
       break; 

     case REQUEST_CODE_PHOTO: 

      photoUri = data.getData(); 

      String photoPath = photoUri.toString(); 
      videoDB.addPhotoRow(photoPath); 
      break; 
     } 
    }catch (NullPointerException e){ 
    //prevent crash when returning with Null data to mainactivity. 
    } 

} 

已更新onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent 
data) { 
    // try { 
     switch (requestCode) { 
      case REQUEST_CODE_VIDEO: 

       videoUri = data.getData(); 

       String videoPath = videoUri.toString(); 
       videoDB.addVideoRow(videoPath); 

       //displayVideo.setVideoURI(videoUri); 
       //displayVideo.start(); 
       break; 

     case REQUEST_CODE_PHOTO: 

      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
      Uri tempUri = getImageUri(getApplicationContext(), photo); 

      File finalFile = new File(getRealPathFromURI(tempUri)); 

      String photoPath = finalFile.toString(); 


      videoDB.addPhotoRow(photoPath); 

      break; 
     } 
    //}catch (NullPointerException e){ 
    //prevent crash when returning with Null data to mainactivity. 
    //} 

} 


public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 

public String getRealPathFromURI(Uri uri) { 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
} 

回答

0

要从图像中获取Uri:使用下面提到的代码将位图转换为Uri。您始终可以将位图压缩格式更改为PNG,但是请避免使用.compress行,因为这将无济于事。 PNG不会被压缩。

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); // Used for compression rate of the Image : 100 means no compression 
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "xyz", null); 
    return Uri.parse(path); 
} 

要想从乌里绝对路径使用此方法

public String getRealPathFromURI(Uri uri) { 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int id_uri = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(id_uri); 
} 

希望这能解决你的问题。

0

你走错了路。现在您只会保存拍摄图像的缩略图并将其保存到文件中。原始完整映像已经在文件系统的文件中。

告诉相机的应用程序的意图在哪里存储图像采取。使用putExtra作为EXTRA_OUTPUT。

+0

嗨greenapps。我正在查找这个,并且遇到了putExtra EXTRA_OUTPUT。我相信这只是将照片的Uri添加到发送给onActivityResult的意图,这将解决问题。但是,我不知道如何添加putri的Uri,你会介意怎么做吗? –

+0

只是谷歌的例子。这个网站上有数百个。否uri将不可用作onActivity结果的参数。你应该'记住'使用过的uri。 – greenapps

+0

我有,但我仍然在努力将这些示例适用于我的代码。我不需要实际的文件来将Uri添加到意图中吗? –