【问题标题】:Image not displaying when using application on a tablet在平板电脑上使用应用程序时不显示图像
【发布时间】:2013-07-29 15:28:06
【问题描述】:

我正在尝试启动相机活动,然后在用户保存照片并返回应用时捕捉照片。这在运行 Android 2.2 的手机上运行良好,但在运行 4.1.2 或其他版本的平板电脑上出现 NullPointerException。

当我尝试用传递的“数据”制作位图时,我看到应用程序在“onActivityResult”中出现 NullPointerException(显然没有数据传递):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    pauseTime = System.currentTimeMillis();
    Log.i(TAG, "Camera result time pauseTime should be reset: " + pauseTime);
    Log.i(TAG, "Camera resultCode is equal to: " + resultCode + " RESULT_OK is: " + RESULT_OK);

    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {

        try {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
        } catch (Exception e) {
            // Data is null getting sent back
            e.printStackTrace();
        }

logcat 中的错误是这样的:

07-29 17:16:50.795: W/System.err(19517): java.lang.NullPointerException
07-29 17:16:50.795: W/System.err(19517):    at     com.android.thoughtfi.UsersThoughts.onActivityResult(UsersThoughts.java:163)
07-29 17:16:50.795: W/System.err(19517):    at android.app.Activity.dispatchActivityResult(Activity.java:5391)
07-29 17:16:50.795: W/System.err(19517):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3215)
07-29 17:16:50.795: W/System.err(19517):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3262)
07-29 17:16:50.795: W/System.err(19517):    at android.app.ActivityThread.access$1200(ActivityThread.java:140)
07-29 17:16:50.795: W/System.err(19517):    at     android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
07-29 17:16:50.800: W/System.err(19517):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-29 17:16:50.800: W/System.err(19517):    at android.os.Looper.loop(Looper.java:137)
07-29 17:16:50.800: W/System.err(19517):    at android.app.ActivityThread.main(ActivityThread.java:4947)
07-29 17:16:50.800: W/System.err(19517):    at java.lang.reflect.Method.invokeNative(Native Method)

为什么没有任何数据返回到应用程序的 onactivityresult?

编辑(更多信息,这里是照片按钮):

    photoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // possible option
            String fileName = "temp.jpg";
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, fileName);
            mCapturedImageURI = getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
            startActivityForResult(intent, CAMERA_REQUEST);
        }
    });

编辑这似乎工作正常,但无论我如何在平板电脑上拍摄照片,我仍然会以横向模式显示照片:

onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    pauseTime = System.currentTimeMillis();
    Log.i(TAG, "Camera result time pauseTime should be reset: " + pauseTime);
    Log.i(TAG, "Camera resultCode is equal to: " + resultCode + " ");

    Log.i(TAG, "The intent mCapturedImageURI was: " + mCapturedImageURI);

    Bitmap photo = null;
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
        if(data != null){
            photo = (Bitmap) data.getExtras().get("data");
        } else {
                try {
                    photo = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mCapturedImageURI);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }               
        }

        imageView.setImageBitmap(photo);
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(mCapturedImageURI, projection, null,
                null, null);
        int column_index_data = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        capturedImageFilePath = cursor.getString(column_index_data);

照片按钮:

photoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // possible option
            String fileName = "temp.jpg";
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, fileName);
            mCapturedImageURI = getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
            startActivityForResult(intent, CAMERA_REQUEST);
        }
    });

【问题讨论】:

  • UserThoughts.java 文件的第 163 行在哪里?
  • 这里是抛出异常的地方:Bitmap photo = (Bitmap) data.getExtras().get("data");
  • 由于您有 try catch 块,我看不出您显示的代码是如何导致应用程序崩溃的。你的问题是你为什么获得 NPE?
  • 好吧,我添加了 try catch 块以防止代码崩溃并查看错误。该错误是由于 NullPointerException,是的。我不明白。我想我应该让问题标题更具体
  • Android 4.0 及更高版本对 Image 的处理方式不同。参考我的回答来解决这个问题stackoverflow.com/questions/17682604/…

标签: android


【解决方案1】:

在相机的reference page 上,文档声明它返回包含捕获图片的文件的路径。

相关代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(this, "Image saved to: " + data.getData(), Toast.LENGTH_LONG).show();
        } else {
          // whatever
        }
    }

编辑:来自MediaStore.ACTION_IMAGE_CAPTURE description

可以发送到相机应用程序的标准 Intent 操作 捕获图像并将其返回。

调用者可能会传递一个额外的 EXTRA_OUTPUT 来控制此图像的位置 将被写入。如果 EXTRA_OUTPUT 不存在,那么一个小的 大小的图像作为额外字段中的位图对象返回。这是 对于只需要小图像的应用程序很有用。如果 EXTRA_OUTPUT 存在,则全尺寸图像将被写入 EXTRA_OUTPUT 的 Uri 值。

如果我理解这一点,Camera 活动将返回:

  • 完整图像的 Uri,如果指定了 EXTRA_OUTPUT
  • 如果未指定 EXTRA_OUTPUT,则为 getExtras().get("data") 中的缩略图

您是否在启动相机的 Intent 中指定了 EXTRA_OUTPUT 参数?

【讨论】:

  • 不,我没有指定它。也许在以后的版本中,缩略图不会自动返回,所以应该使用 EXTRA_OUTPUT 我也会尝试这种方式,看看它是如何工作的
  • 实际上我的意图中确实有 EXTRA_OUTPUT 参数。感谢您的帮助,这导致了一个好看的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多