【问题标题】:onActivityResult not called after taking picture拍照后未调用 onActivityResult
【发布时间】:2014-01-15 13:44:20
【问题描述】:

如何知道该主题有据可查,并且我已经阅读了很多关于该问题的内容,但我仍然遇到以下问题:当我使用我的应用程序拍照并单击“验证”按钮时,什么也没有发生。我正在做的事情的目的:传递给 onActivityReult 函数的不仅仅是缩略图,还有相机拍摄的“整个”图片。

这是为“拍照”按钮定义的监听器:

@Override
        public void onClick(View v) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "CameraTest");
            mediaStorageDir.mkdir(); // make sure you got this folder
            Log.i("Report",mediaStorageDir.toString());
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");

            try
            {
                //create directories and the file
                mediaFile.getParentFile().mkdirs();
                mediaFile.createNewFile();
            } catch (IOException e) { 
                Log.e("Report", "create error for file "+mediaFile);
                e.printStackTrace();
            }
            mFileUri = Uri.fromFile(mediaFile);
            Log.i("Report","Uri: "+mFileUri);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);// this line causes issue - onActivityResult not called...
            startActivityForResult(intent, CAMERA_PIC_REQUEST);
}
});

这里是 onActivityResult 方法......它从未被调用(并且未在 onClickListener 方法中声明):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("Report", "1");
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == CAMERA_PIC_REQUEST) {
            try {
                String[] projection = {
                        MediaStore.Images.Thumbnails._ID, // The columns we want
                        MediaStore.Images.Thumbnails.IMAGE_ID,
                        MediaStore.Images.Thumbnails.KIND,
                        MediaStore.Images.Thumbnails.DATA };
                String selection = MediaStore.Images.Thumbnails.KIND + "=" + 
                        MediaStore.Images.Thumbnails.MINI_KIND;
                String sort = MediaStore.Images.Thumbnails._ID + " DESC";
                Cursor myCursor = this.managedQuery(
                        MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                        projection, selection, null, sort);
                Log.d("Report", "3");
                long imageId = 0l;
                long thumbnailImageId = 0l;
                String thumbnailPath = "";

                try {
                    myCursor.moveToFirst();
                    imageId = myCursor
                            .getLong(myCursor
                                    .getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));
                    thumbnailImageId = myCursor
                            .getLong(myCursor
                                    .getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID));
                    thumbnailPath = myCursor
                            .getString(myCursor
                                    .getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
                } finally {
                    myCursor.close();
                }

                String[] largeFileProjection = {
                        MediaStore.Images.ImageColumns._ID,
                        MediaStore.Images.ImageColumns.DATA };

                String largeFileSort = MediaStore.Images.ImageColumns._ID
                        + " DESC";
                myCursor = this.managedQuery(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        largeFileProjection, null, null, largeFileSort);
                String largeImagePath = "";

                try {
                    myCursor.moveToFirst();

                    // This will actually give yo uthe file path location of the
                    // image.
                    largeImagePath = myCursor
                            .getString(myCursor
                                    .getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
                    mImageCaptureUri = Uri.fromFile(new File(
                            largeImagePath));

                } finally {
                    // myCursor.close();
                }
                Uri uriLargeImage = Uri.withAppendedPath(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        String.valueOf(imageId));
                Uri uriThumbnailImage = Uri.withAppendedPath(
                        MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                        String.valueOf(thumbnailImageId));

                Bitmap thumbnail = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uriThumbnailImage);
                Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uriLargeImage);

但是,正如标题中所说,onActivityResult 没有被调用。你能找出原因吗?因为我几乎尝试了我在该主题上找到的所有内容,但我应该错过了一些东西。

谢谢!

【问题讨论】:

  • 你确定它没有被调用吗?你用调试器检查过吗?
  • onActivityResult 方法的第一行是打印,我在 logcat 中什么都没有
  • 我问它是因为 logcat 有时会遗漏消息。
  • 同意@ÁronNemmondommegavezetéknevem。检查是否打印了其他 logcat 消息。
  • 请删除 super.onActivityResult(requestCode, resultCode, data); (第 2 行)来自 onActivityResult() 函数。

标签: java android android-camera


【解决方案1】:

检查您是否在AndroidManifest.xml 中声明了正确的权限

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

并确保您要写入的文件存在:
在下面添加puc_img = new File(photo,"Puc_Img.jpg");

try
{
    //create directories and the file
    puc_file.getParentFile().mkdirs();
    puc_file.createNewFile();
} catch (IOException e) { }    

【讨论】:

  • 我确实有这些台词
  • 据我所知,文件必须存在才能拍照,所以试试上面的代码:) - 我进一步更新了它以提供一个现有目录来创建文件
  • 只是一个问题:你如何初始化 puc_file?
  • 这是对您的代码的补充。把它放在puc_img = new File(photo,"Puc_Img.jpg");的正下方@
  • 呜呜呜。好的。这就是我所做的。由于我只是使用 photo var,因此我删除了所有 puc_img 的出现。我在基础问题中相应地编辑了代码。但是现在,我仍然无法触发 onActivityResult 方法。我做错了什么?
【解决方案2】:

从您的代码中不清楚,但您可以在 onClickListener 中声明 onActivityResult。如果这是真的,你需要移动它。 看看这个答案:

OnActivityResult ()

【讨论】:

  • 不,onActivityResult方法没有在onClickListener中声明:)
【解决方案3】:

好的,为了解决这个问题,我在这里使用了一些“技巧”:

@Override
        public void onClick(View v) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "CameraTest");
            mediaStorageDir.mkdir(); // make sure you got this folder
            Log.i("Report",mediaStorageDir.toString());
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");

            try
            {
                //create directories and the file
                mediaFile.getParentFile().mkdirs();
                mediaFile.createNewFile();
            } catch (IOException e) { 
                Log.e("Report", "create error for file "+mediaFile);
                e.printStackTrace();
            }
            tmpFilePath = mediaFile.getPath();
            mFileUri = Uri.fromFile(mediaFile);
            Log.i("Report","Uri: "+mFileUri);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);
            startActivityForResult(intent, CAMERA_PIC_REQUEST);
        }

    });

那么,我正在恢复存储在 tmpFilePath 中的文件,方法是在 onActivityResult 函数中使用该方法:

Bitmap image = BitmapFactory.decodeFile(this.tmpFilePath);

而且...它工作正常。在将文件发送到 WS 时,我仍然遇到一些问题,但是该问题已经被那段代码解决了。谢谢你的帮助,你让我走上了正轨:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2011-06-30
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多