【问题标题】:How to take photo from fragment如何从片段中拍照
【发布时间】:2017-08-21 20:23:30
【问题描述】:

我想从片段中拍照,但如果我使用跟随代码 onActivityResult Intent 数据 return null。我不明白为什么 Intent 数据返回 null

CameraFragement.java

private void takePictureIntent() {

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(getContext(),
                    "com.example.android.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
}

String imagePath;

private File createImageFile() throws IOException {

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    imagePath = image.getAbsolutePath();
    return image;
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)  { // this Intent data return null
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {


        Intent intent = new Intent(getActivity(), PostActivity.class);
        intent.setData(data.getData());
        startActivity(intent);

    } 
}

如果我使用下面的代码而不是上面的 takePictureIntent Intent 数据返回附加值,但 data.getData() 返回 null。我不想返回带有额外内容的数据。我不想位图数据。我需要数据 Uri 表单。我需要 data.getData()。此后续代码以前使用过,但现在不起作用。我总是使用 Android SDK 更新我的应用程序。我认为这是原因,但解决方案是什么?

private void takePictureIntent() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}

编辑:我几乎尝试了所有方法,但 Intent 数据仍然返回 null。我现在正在使用第一个代码示例的后续代码。你可以用这个,很好用。如果您有 Intent 数据的解决方案,请不要忘记通知我。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        File file = new File(imagePath);
        Uri uri = Uri.fromFile(file);
        Intent intent = new Intent(getActivity(), PostActivity.class);
        intent.setData(uri);
            startActivity(intent);
}

【问题讨论】:

  • 请详细说明,为什么要在这个问题中(故意)添加firebase 标签?因为我在那里看不到它的任何用法

标签: android android-fragments firebase android-camera


【解决方案1】:

//抓图

public void requestTakePhoto() {
 //SettingsManager.sharedInstance().TAKE_PHOTO = true;
 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
  final File photoFile;
  try {
    photoFile = createImageFile();
  }
  catch (IOException e) {
    // Error occurred while creating the File
    Log.e("ChatActivity", "Unable to create photo file", e);
    return;
  }
  // Continue only if the File was successfully created
  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
  startActivityForResult(intent, REQ_TAKE_PHOTO);
  }
}

//保存捕获的图像

private Uri mPhotoLocation;
private File createImageFile() throws IOException {
  final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(newDate());
  final String imageFileName = timeStamp + "filename";
  final File storageDir =     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  final File image = File.createTempFile(imageFileName, ".jpg", storageDir);
  mPhotoLocation = Uri.fromFile(image);
  return image;
}

//处理结果

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data){

 switch (requestCode) {
  case REQ_PICK_IMAGE:
    if (resultCode == Activity.RESULT_OK && data.getData() != null) {

      Uri  uri =data.getData();

      //do your work with data

     // String filePath = getRealPathFromUri(uri);
      //if (filePath != null && !filePath.isEmpty()) {
       // Uri fileUri = Uri.parse(filePath);
        //sendImageMessage(fileUri);
      }
    }
    break;
  case REQ_TAKE_PHOTO:
    if (resultCode == Activity.RESULT_OK ) {
      //do your work with data
      String filePath = getRealPathFromUri(mPhotoLocation);
      if (filePath != null && !filePath.isEmpty()) {
        Uri fileUri = Uri.parse(filePath);
        sendImageMessage(fileUri);
      }
      mPhotoLocation = null;
    }
    break;
  case REQ_FILE_ATTACHMENT:
    if (resultCode == Activity.RESULT_OK && data.getData() != null) {
      Uri uri = data.getData();
      //String filePath = getRealPathFromUri(uri);
      //if (filePath != null && !filePath.isEmpty()) {
        //Uri fileUri = Uri.parse(filePath);
        //sendFileMessage(fileUri);
      }
    }
    break;
  default:
    super.onActivityResult(requestCode, resultCode, data);
    break;
  }
}

//获取真实路径

public String getRealPathFromUri(final Uri uri) {
// DocumentProvider
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(getActivity(), uri)) {
  // ExternalStorageProvider
   if (isExternalStorageDocument(uri)) {
    final String docId = DocumentsContract.getDocumentId(uri);
    final String[] split = docId.split(":");
    final String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
      return Environment.getExternalStorageDirectory() + "/" + split[1];
    }
  }
  // DownloadsProvider
  else if (isDownloadsDocument(uri)) {

    final String id = DocumentsContract.getDocumentId(uri);
    final Uri contentUri = ContentUris.withAppendedId(
      Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

    return getDataColumn(getActivity(), contentUri, null, null);
  }
  // MediaProvider
  else if (isMediaDocument(uri)) {
    final String docId = DocumentsContract.getDocumentId(uri);
    final String[] split = docId.split(":");
    final String type = split[0];

    Uri contentUri = null;
    if ("image".equals(type)) {
      contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    } else if ("video".equals(type)) {
      contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    } else if ("audio".equals(type)) {
      contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    }

    final String selection = "_id=?";
    final String[] selectionArgs = new String[]{
      split[1]
    };

    return getDataColumn(getActivity(), contentUri, selection, selectionArgs);
  }
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {

  // Return the remote address
  if (isGooglePhotosUri(uri))
    return uri.getLastPathSegment();

  return getDataColumn(getActivity(), uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
  return uri.getPath();
}

 return null;
}


private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {

Cursor cursor = null;
final String column = "_data";
final String[] projection = {
  column
};

try {
  cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
    null);
  if (cursor != null && cursor.moveToFirst()) {
    final int index = cursor.getColumnIndexOrThrow(column);
    return cursor.getString(index);
  }
} finally {
  if (cursor != null)
    cursor.close();
}
 return null;
 }

private boolean isExternalStorageDocument(Uri uri) {
  return "com.android.externalstorage.documents".equals(uri.getAuthority());
}


private boolean isDownloadsDocument(Uri uri) {
   return "com.android.providers.downloads.documents".equals(uri.getAuthority());
 }

private boolean isMediaDocument(Uri uri) {
  return "com.android.providers.media.documents".equals(uri.getAuthority());
 }

private boolean isGooglePhotosUri(Uri uri) {
   return "com.google.android.apps.photos.content".equals(uri.getAuthority());
 }

【讨论】:

  • 感谢您的帮助,但这几乎与我的方式相同,并且 Intent 数据仍然返回 null。我更新了我的问题并写了临时答案以帮助您回答。
【解决方案2】:

requestcode在fragment中丢失,需要使用activity context:

getActivity().startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);

【讨论】:

  • 即使我试过这个; getActivity().startActivityFromFragment(CameraFragment.this, intent, REQUEST_IMAGE_CAPTURE);但没有。还是不行。
  • 你有没有在你的 takePictureIntent 中尝试 setData(photoURI)
  • 我试过了,我得到了这个错误; android.content.ActivityNotFoundException: No Activity found to handle Intent 我认为我们不能将 setData 与 ACTION_IMAGE_CAPTURE 意图一起使用。
【解决方案3】:

该库将帮助您从CameraStorage 获取图像以在ActivityFragment 中查看。 它提供了非常简单的方法来做到这一点,

https://github.com/coomar2841/image-chooser-library

【讨论】:

  • 我不想为这个问题使用库。我认为解决方案很简单,但我错过了一些东西。
  • 是的,我知道这很容易,但请查看这个库代码,这将帮助您找出问题。
  • 我检查了那个库。如果使用它,我必须更改我的应用程序逻辑。我暂时不想那样。顺便说一句,我没有投反对票。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多