簡體   English   中英

Camera Intent僅在某些設備上返回null

[英]Camera Intent return null only on some devices

我正在使用相機捕獲圖像並將返回的位圖設置為imageview,但是在OnePlus設備上崩潰。 我檢查了幾台htc設備,它運行正常。 我檢查了解決方案,他們說要檢查請求代碼,但我已經在做了。 這可能是什么問題?

這是代碼

 imageView.setOnClickListener(new View.OnClickListener() {


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

            startActivityForResult(cameraIntent, 1);
        }
    });

和onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && resultCode == -1) {
        image = (Bitmap) data.getExtras().get("data");
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        // Must compress the Image to reduce image size to make upload easy
        image.compress(Bitmap.CompressFormat.PNG, 50, stream);
        byte[] byte_arr = stream.toByteArray();
        // Encode Image to String
        encodedString = Base64.encodeToString(byte_arr, 0);
        Uri selectedImageUri = data.getData();
        img_path = getRealPathFromURI(selectedImageUri);
      //  Uri tempUri = getImageUri(getApplicationContext(), image);
        imageView.setImageBitmap(image);
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    }
}

和堆棧跟蹤錯誤

STACK_TRACE = java.lang.RuntimeException:無法將結果ResultInfo {who = null,request = 1,result = -1,data = Intent {act = inline-data(has extras}})傳遞給活動{com.madhours / com。 madhours.activities.ActivitySignUp}:java.lang.NullPointerException:嘗試在android.app.ActivityThread.deliverResults(ActivityThread。)上的空對象引用上調用虛擬方法'java.lang.String android.net.Uri.getPath()'。 java:3659)位於android.app.ActivityThread.handleSendResult(ActivityThread.java:3702)at android.app.ActivityThread.access $ 1300(ActivityThread.java:155)at android.app.ActivityThread $ H.handleMessage(ActivityThread.java: 1366)在android.os.Handler.dispatchMessage(Handler.java:102)在android.os.Looper.loop(Looper.java:135)在android.app.ActivityThread.main(ActivityThread.java:5343)在java。 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:905)處java.lang.reflect.Method.invoke(Method.java:372)處的lang.reflect.Method.invoke(本機方法)安德羅 d.internal.os.ZygoteInit.main(ZygoteInit.java:700)原因:java.lang.NullPointerException:嘗試在空對象上調用虛擬方法'java.lang.String android.net.Uri.getPath()'在com.madhours.activities.ActivitySignUp.onActivityResult(ActivitySignUp.java:116)在com.madhours.activities.ActivitySignUp.getRealPathFromURI(ActivitySignUp.java:116)處的引用在android.app.Activity.dispatchActivityResult(Activity.java:6218) android.app.ActivityThread.deliverResults(ActivityThread.java:3655)...另外10個java.lang.NullPointerException:嘗試在null上調用虛擬方法'java.lang.String android.net.Uri.getPath()' com.madhours.activities.ActivitySignUp.onActivityResult(ActivitySignUp.java:116)的com.madhours.activities.ActivitySignUp.getRealPathFromURI(ActivitySignUp.java:116)上的android.app.Activity.dispatchActivityResult(Activity.java:6218)上的對象引用)在android.app.ActivityThread.handle的android.app.ActivityThread.deliverResults(ActivityThread.java:3655) android.app.ActivityThread.access上的SendResult(ActivityThread.java:3702).android.os.Handler.dispatchMessage($ 1300(ActivityThread.java:155)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1366) android.os.Looper.loop(Looper.java:135)處的Handler.java:102)java.lang.reflect.Method.invoke(本機方法)處android.app.ActivityThread.main(ActivityThread.java:5343)處在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:905)處的com.android.internal.os.ZygoteInit.main處的java.lang.reflect.Method.invoke(Method.java:372) (ZygoteInit.java:700)

這可能是什么問題?

問題是您正在對返回的Intent調用getData() ACTION_MEDIA_STORE Uri不屬於ACTION_MEDIA_STORE合同的一部分:

調用方可以傳遞一個額外的EXTRA_OUTPUT來控制該圖像的寫入位置。 如果不存在EXTRA_OUTPUT,則會在Extra字段中將一個小型圖像作為Bitmap對象返回。 這對於只需要較小圖像的應用程序很有用。 如果存在EXTRA_OUTPUT,則將全尺寸圖像寫入EXTRA_OUTPUT的Uri值。

假設您沒有將EXTRA_OUTPUT放在與startActivityForResult()一起使用的Intent ,那么唯一的結果就是dataBitmap

如果要在某處寫入完整尺寸的圖像,請在EXTRA_OUTPUT提供該位置的路徑,然后保留該路徑並在調用onActivityResult()時使用它:

/***
 Copyright (c) 2008-2016 CommonsWare, LLC
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
 use this file except in compliance with the License. You may obtain a copy
 of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
 by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 OF ANY KIND, either express or implied. See the License for the specific
 language governing permissions and limitations under the License.

 From _The Busy Coder's Guide to Android Development_
 https://commonsware.com/Android
 */

package com.commonsware.android.camcon;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;

public class CameraContentDemoActivity extends Activity {
  private static final String EXTRA_FILENAME=
    "com.commonsware.android.camcon.EXTRA_FILENAME";
  private static final String FILENAME="CameraContentDemo.jpeg";
  private static final int CONTENT_REQUEST=1337;
  private File output=null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    if (savedInstanceState==null) {
      File dir=
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

      dir.mkdirs();
      output=new File(dir, FILENAME);
    }
    else {
      output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME);
    }

    if (output.exists()) {
      output.delete();
    }

    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));

    startActivityForResult(i, CONTENT_REQUEST);
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putSerializable(EXTRA_FILENAME, output);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode,
                                  Intent data) {
    if (requestCode == CONTENT_REQUEST) {
      if (resultCode == RESULT_OK) {
        Intent i=new Intent(Intent.ACTION_VIEW);

        i.setDataAndType(Uri.fromFile(output), "image/jpeg");
        startActivity(i);
        finish();
      }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM