【问题标题】:Android: App crashes on onActivityResult while using Camera IntentAndroid:使用相机意图时应用程序在 onActivityResult 上崩溃
【发布时间】:2016-04-02 23:07:45
【问题描述】:

我正在使用相机意图在我的应用中捕获图像。我的应用程序在使用相机时在Android 5.0.2 上崩溃的问题。我正在使用片段中的意图。以下是我在片段中的代码:

拍照方法

private void takePhoto() {
    mHighQualityImageUri = Util.generateTimeStampPhotoFileUri(getActivity());
    Log.d(UploadPicturesFragment.class.getSimpleName(),
            "URI: " + mHighQualityImageUri.toString());
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mHighQualityImageUri);
    startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}

我的片段中的onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        return;
    }

    if (requestCode == REQUEST_IMAGE_CAPTURE) {
    Log.d(UploadPicturesFragment.class.getSimpleName(),
                "IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
                    mHighQualityImageUri);
            DroomUtil.beginCrop(mHighQualityImageUri, getActivity(), this, true, bitmap.getWidth(),
                    bitmap.getHeight());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

日志跟踪

12-29 10:28:03.491: E/AndroidRuntime(9780): java.lang.RuntimeException:       Unable to resume activity {in.droom/in.droom.activity.MainActivity}:     java.lang.RuntimeException: Failure delivering result    ResultInfo{who=android:fragment:2, request=1, result=-1, data=null} to activity   {in.droom/in.droom.activity.MainActivity}: java.lang.NullPointerException:   Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()'   on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3224)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3257)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.os.Handler.dispatchMessage(Handler.java:102)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.os.Looper.loop(Looper.java:155)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.main(ActivityThread.java:5702)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at java.lang.reflect.Method.invoke(Native Method)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at java.lang.reflect.Method.invoke(Method.java:372)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
12-29 10:28:03.491: E/AndroidRuntime(9780): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:2, request=1, result=-1, data=null} to activity {in.droom/in.droom.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3881)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3197)
12-29 10:28:03.491: E/AndroidRuntime(9780):     ... 11 more
12-29 10:28:03.491: E/AndroidRuntime(9780): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.content.ContentResolver.openInputStream(ContentResolver.java:651)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:1019)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at in.droom.fragments.UploadPicturesFragment.onActivityResult(UploadPicturesFragment.java:395)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.Activity.dispatchActivityResult(Activity.java:6164)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3877)
12-29 10:28:03.491: E/AndroidRuntime(9780):     ... 12 more

行号395是:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
                    mHighQualityImageUri);

【问题讨论】:

  • 我认为你正在某个地方完成你的活动
  • @VivekMishra 但问题仅限于 Android 5.0.2。
  • 是否有任何类显示为已弃用??
  • @VivekMishra 不。我有时发现,当相机打开时,它的方向似乎从横向变为纵向。我的应用只有纵向模式

标签: android android-camera-intent


【解决方案1】:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference

这意味着mHighQualityImageUri 很可能是null。如果您未能使用onSaveInstanceState() 保留该Uri,则会发生这种情况。当您的应用在后台而相机应用在前台时,您的进程完全有可能被终止。

【讨论】:

  • @CommonsWare 它不为空但仍然给出相同的错误
  • @SagarNayak:如果我正确解释了您的问题,当相机应用程序处于前台时,请从 Android Studio 终止您的应用程序进程。然后,用相机拍照。当控制权返回到您的应用时,Android 将需要为您创建一个新进程。
【解决方案2】:

按照以下步骤从相机拍照并显示到ImageView

1) 启动相机意图

Uri fileUri;
String photoPath = "";

 private void startingCameraIntent()
    {
        String fileName = System.currentTimeMillis()+".jpg";
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, fileName);
        fileUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(intent, YOUR_REQ_CODE);
    }

2) 回调onActivityResult函数

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (resultCode == Activity.RESULT_OK)
        {
            try
            {
                photoPath = getPath(fileUri);

                System.out.println("Image Path : " + photoPath);

                Bitmap b = decodeUri(fileUri);
                your_image_view.setImageBitmap(b);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

3) decodeUri 函数

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException
    {
        BitmapFactory.Options o = new BitmapFactory.Options();

        o.inJustDecodeBounds = true;

        BitmapFactory.decodeStream(getContentResolver()
                                           .openInputStream(selectedImage), null, o);

        final int REQUIRED_SIZE = 72;

        int width_tmp = o.outWidth, height_tmp = o.outHeight;

        int scale = 1;

        while (true)
        {
            if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
            {
                break;
            }
            width_tmp /= 2;

            height_tmp /= 2;

            scale *= 2;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();

        o2.inSampleSize = scale;

        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                                           .openInputStream(selectedImage), null, o2);

        return bitmap;
    }

4) 获取图片路径

@SuppressWarnings("deprecation")
    private String getPath(Uri selectedImaeUri)
    {
        String[] projection = { MediaStore.Images.Media.DATA };

        Cursor cursor = managedQuery(selectedImaeUri, projection, null, null,
                                     null);

        if (cursor != null)
        {
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

            return cursor.getString(columnIndex);
        }

        return selectedImaeUri.getPath();
    }

最后在Manifest中定义权限

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

注意:如果您使用的是 marshmallow (Android 6.0),您必须在使用相机应用之前设置权限检查。你可以阅读关于Android的Requesting Permissions at Run Time

【讨论】:

    【解决方案3】:

    首先检查data 是否是nullonActivityResult 通过添加一个额外的代码这将防止你的应用程序崩溃,像这样

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK && data !=null) {
        return;
    }
    }
    

    然后考虑这节课,它解释了how to capture photos using an existing camera application.

    有一个关于Requesting camera permission 的完整参考,使用uses-feature tagGetting a thumbnailSaving full size photo,还有更多可能对您完成任务很有帮助的参考...

    【讨论】:

    • data !=null 对吗?为什么不是“data ==null”?
    【解决方案4】:
        please check your path from mHighQualityImageUri because output path is not found, below code is modify please check it, it work and remember camera result is give in Main Activity class because You used Fragment so declare on activity Result in Main Activity (Fragment Activity) class.   
    //on Fragment Class
    private void takePhoto() {
                 /*   mHighQualityImageUri = Util.generateTimeStampPhotoFileUri(getActivity());
                    Log.d(UploadPicturesFragment.class.getSimpleName(),
                            "URI: " + mHighQualityImageUri.toString());*/
                    imageUri =Uri.fromFile(new File("/sdcard/"));
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    context.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
                }
    
        //on Main Activity Class
          @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                if (requestCode == 1) {
                 /*   Log.d(UploadPicturesFragment.class.getSimpleName(),
                            "IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));*/
                    try {
    
                        /*if(imageUri==null){
                            Log.i("Bitmap", "Image URI Null");
                        }else {
                            Log.i("Bitmap","Image URI is not Null");
                        }*/
                        Uri imageUri = Uri.fromFile(new File("/sdcard/"));
                        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),imageUri);
        //                        mHighQualityImageUri);
                        if(bitmap !=null)
                        {
                            Log.i("Bitmap", "Bitmap not Null");
                        }else {
                            Log.i("Bitmap","Bitmap is Null");
                        }
                        //  DroomUtil.beginCrop(mHighQualityImageUri, getActivity(), this, true, bitmap.getWidth(),
                        // bitmap.getHeight());
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                super.onActivityResult(requestCode, resultCode, data);
            }
    

    【讨论】:

      【解决方案5】:

      在 android 上,我看到不同的设备在使用相机和画廊选择图像时表现出不同的行为。我发现更好的方法是:

      1. 在您的应用中创建内容提供程序。
      2. 从您的内容提供商处获取 Uri 并将其传递给相机 Intent。
      3. 相机会将捕获的图像写入您的 Uri。
      4. 使用 context.getContentResolver().openInputStream() 读取它。

      此方法使您的代码独立于返回的 Uri,因为您拥有该 Uri。此外,这也支持图库图像选择,只需稍作修改。

      我发现您的相机也存在设备方向问题。这(不幸的是)需要在您的应用程序中进行处理,您在后处理步骤中获取图像。我也在下面概述了它的代码。大多数情况下,方向问题发生在三星设备上,相机仅在横向模式下拍摄图像。

      为图片创建 Uri:

      string imageId = "IMG" + System.currentTimeMillis();
      Uri attachmentUri = Uri.parse("content://"+ AttachmentContentProvider.AUTHORITY + "/images/" + imageId); 
      // Store this as a member in your activity/fragment as mAttachmentUri
      

      注意:使用共享首选项或使用 onSaveInstanceState() 的活动包保持 mAttachmentUri 很重要,否则当您的应用被杀死时,Uri 可能会丢失。

      获取相机意图:

      public static Intent getImageCaptureIntent(Context context, Uri outputFileUri)
      {
          Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
          return cameraIntent;
      }
      

      阅读图片:

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) 
      {
          if (resultCode != Activity.RESULT_OK) {
              return;
          }
      
          if (requestCode == REQUEST_IMAGE_CAPTURE) 
          {
      
              try {
                  Bitmap bitmap = decodeSampledBitmapFromResource(getActivity(), mAttachmentUri, Config.RGB_565);
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      
          public static Bitmap decodeSampledBitmapFromResource(Context context, Uri uri, Config config)
          { 
              Bitmap bmp = null;
              InputStream is = null;
              if (uri != null)
              {
                  try
                  {
                      is = context.getContentResolver().openInputStream(uri);
      
                      boolean resize = true;
                      // First decode with inJustDecodeBounds=true to check dimensions
                      BitmapFactory.Options options = new BitmapFactory.Options();
                      options.inJustDecodeBounds = true;
                      BitmapFactory.decodeStream(is, null, options);
                      mLogger.d("Image Original Width:" + options.outWidth + " Height:" + options.outHeight );
                      // close and open the stream again
                      is.close();
      
                      is = context.getContentResolver().openInputStream(uri);
                      int reqWidth = options.outWidth;
                      int reqHeight = options.outHeight;
      
                      // Decode bitmap with inSampleSize set
                      options.inJustDecodeBounds = false;
                      options.inPreferredConfig = config;     
                      bmp = BitmapFactory.decodeStream(is, null, options);
      
                      if(bmp != null)
                      {
                          bmp = correctImageRotation(context, bmp, uri);
                      }
                      else
                      {
                          mLogger.e("BitmapFactory.decodeStream returned null bitmap , skip correctImageRotation");
                      }
                  }
                  catch (FileNotFoundException fnfex)
                  {
                      mLogger.e("FileNotFoundException : while decoding inline image bitmap: " + fnfex.getMessage());
                  }
                  catch (IOException ioex)
                  {
                      mLogger.e("IOException : while decoding inline image bitmap: " + ioex.getMessage());
                  }
                  catch (OutOfMemoryError e)
                  {
                      mLogger.e("OutOfMemoryError : in decodeSampledBitmapFromResource BitmapFactory.decodeStream . Skip loading Resource");
                  }
                  finally
                  {
                      try
                      {
                          if (is != null)
                          {
                              is.close();
                          }
                      }
                      catch (IOException ioex2)
                      {
                          mLogger.e("IOException2 : while decoding inline image bitmap: " + ioex2.getMessage());
                      }
                  }
              }
              return bmp;
          }
      
          // Seemed necessary on a lot of Samsung devices
          public static Bitmap correctImageRotation( Context context, Bitmap bitmap , Uri inputUri ) throws FileNotFoundException
          {
              int orientation = ExifInterface.ORIENTATION_UNDEFINED;
      
              try
              {
                  String appfilesDir = context.getApplicationContext().getFilesDir().getAbsolutePath();
                  String attachmentDirPath = appfilesDir + ('/') + "images");
                  String fileName = ContentUris.parseId(uri) + ".jpg";
                  String absolutePath = attachmentDirPath + ('/') + fileName;
                  ExifInterface exif = new ExifInterface(path);
                  orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
              }
              catch (IOException e)
              {
              }
      
              return rotateBitmap(bitmap, orientation);
          }
      
          /**
           * rotate bitmap code reference:
           * http://stackoverflow.com/questions/20478765/how-to-get-the-correct-orientation-of-the-image-selected-from-the-default-image
           */
          private static Bitmap rotateBitmap(Bitmap bitmap, int orientation)
          {
              Matrix matrix = new Matrix();
              switch (orientation)
              {
              case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                  matrix.setScale(-1, 1);
                  break;
              case ExifInterface.ORIENTATION_ROTATE_180:
                  matrix.setRotate(180);
                  break;
              case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                  matrix.setRotate(180);
                  matrix.postScale(-1, 1);
                  break;
              case ExifInterface.ORIENTATION_TRANSPOSE:
                  matrix.setRotate(90);
                  matrix.postScale(-1, 1);
                  break;
              case ExifInterface.ORIENTATION_ROTATE_90:
                  matrix.setRotate(90);
                  break;
              case ExifInterface.ORIENTATION_TRANSVERSE:
                  matrix.setRotate(-90);
                  matrix.postScale(-1, 1);
                  break;
              case ExifInterface.ORIENTATION_ROTATE_270:
                  matrix.setRotate(-90);
                  break;
              case ExifInterface.ORIENTATION_NORMAL:
              case ExifInterface.ORIENTATION_UNDEFINED:
              default:
                  return bitmap;
              }
              try
              {
                  Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                  bitmap.recycle();
                  return bmRotated;
              }
              catch (OutOfMemoryError e)
              {
                  mLogger.e("OutOfMemoryError occured while rotating the image");
                  return bitmap;
              }
          }
      

      内容提供者:

      对于内容提供程序的实现,您可以使用 android 的 FileProvider 或实现如下所示的内容提供程序。此内容提供程序将在您的应用程序容器中打开一个文件,供相机应用程序写入。

      public class AttachmentContentProvider extends ContentProvider 
      {
          public static final String AUTHORITY = "com.yourcompany.yourapp.AttachmentContentProvider";
          public static final int ENTITY_ATTACHMENT = 1;
          public static final int ENTITY_ATTACHMENT_ID = 2;
      
          private static final UriMatcher sUriMatcher;
          static 
          {
              sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
              sUriMatcher.addURI(AUTHORITY, "images", ENTITY_ATTACHMENT);
              sUriMatcher.addURI(AUTHORITY, "images"+"/#", ENTITY_ATTACHMENT_ID);
          }
      
          @Override
          public boolean onCreate()
          {
              return true;
          }
      
          @Override
          public int delete(Uri uri, String where, String[] whereArgs)
          {
              return 0;
          }
      
          @Override
          public String getType(Uri uri)
          {
              int match = sUriMatcher.match(uri);
              switch (match) 
              {
              case ENTITY_ATTACHMENT:
              case ENTITY_ATTACHMENT_ID:
                  return "image/jpeg";
      
              default:
                  return null;
              }
          }
      
          @Override
          public Uri insert(Uri uri, ContentValues initialValues)
          {
              return null;
          }
      
          @Override
          public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
          {
              return null;
          }
      
          @Override
          public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
          {
              return 0;
          }
      
          public static File getAttachmentFile(String fileName)
          {
              String appfilesDir = context.getApplicationContext().getFilesDir().getAbsolutePath();
              String attachmentDirPath = appfilesDir + ('/') + "images");
              File newFile = new File(AttachmentHelper.getAttachmentsDir() + File.separator + fileName);
              newFile.getParentFile().mkdirs();
              return newFile;
          }
      
      
          @Override
          public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
          {
              long id = -1;
              try
              {
                  id = ContentUris.parseId(uri);
              }
              catch (NumberFormatException e)
              {
                  m_logger.e("Invalid id for Uri : " + uri );
              }
      
              String filename  = id + ".jpg"; // id will be IMG+current time millis
              File imageFile = getAttachmentFile(id); 
              return (ParcelFileDescriptor.open(file, parseMode(mode)));
          }
      }
      

      总而言之,此代码应该适用于大多数经过测试的设备,并在需要时对从相机接收到的图像进行校正。

      【讨论】:

        【解决方案6】:

        根据日志

        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
        

        它清楚地表明你在一个空对象上调用getScheme()。因此,在处理之前,您需要检查 null Intent 数据。

        此外,从 Android M 开始,您需要向用户请求相机权限。缺少摄像头权限,应用会崩溃。

        要了解如何使用新的权限架构,请查看它:http://developer.android.com/training/permissions/index.html

        【讨论】:

          【解决方案7】:

          这是我在项目中经常做的事情,请看看。希望对您有所帮助!

          片段类:

          btnCapturePicture.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {       
                  captureImage();     
              }
          });
          
          btnSelectPicture.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {       
                  selectImage();
              }
          });
          
          ...
          
          private void captureImage() {
              mFileUri = Uri.fromFile(Utils.getOutputMediaFile(MEDIA_TYPE_IMAGE));
              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);
              startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
          }
          
          private void selectImage() {    
              Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
              intent.setType(MIME_IMAGE_ALL); 
              startActivityForResult(intent, SELECT_PHOTO_CODE);
          }
          
          ...
          
          @Override
          public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
              super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
          
              switch (requestCode) {
                  case SELECT_PHOTO_CODE:
                      if (resultCode == Activity.RESULT_OK) {
                          mFileUri = imageReturnedIntent.getData();
                          if (mFileUri != null) {
                              mFilePath = Utils.getRealPathFromUri(mContext, mFileUri);
                              mFilePath = mFilePath.replace("file://", "");
                              // do something such as display ImageView...
                          }
                      }
                      break;
                  case CAMERA_CAPTURE_IMAGE_REQUEST_CODE:
                      if (resultCode == Activity.RESULT_OK) {
                          if (mFileUri != null) {
                              mFilePath = mFileUri.toString();
                              mFilePath = mFilePath.replace("file://", "");
                              // do something such as display ImageView...
                          }
                      }
                      break;
              }
          
              // refresh phone's folder content
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                  Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);     
                  mediaScanIntent.setData(mFileUri);
                  getActivity().sendBroadcast(mediaScanIntent);
              } else {
                  getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
              }
          }
          

          Utils 类:

          //returning image, video
          public static File getOutputMediaFile(int type) {
          
              // External sdcard location
              File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera");
          
              // Create the storage directory if it does not exist
              if (!mediaStorageDir.exists()) {
                  if (!mediaStorageDir.mkdirs()) {
                      return null;
                  }
              }
          
              // Create a media file name
              String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
              File mediaFile;
              if (type == MEDIA_TYPE_IMAGE) {
                  mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
              } else if (type == MEDIA_TYPE_VIDEO) {
                  mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
              } else {
                  return null;
              }
          
              return mediaFile;
          }
          
          //For select picture
          public static String getRealPathFromUri(Context context, Uri contentUri) {
              Cursor cursor = null;
              try {
                  String[] proj = {MediaStore.Images.Media.DATA};
                  cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
                  int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                  cursor.moveToFirst();
                  return cursor.getString(column_index);
              } finally {
                  if (cursor != null) {
                      cursor.close();
                  }
              }
          }
          

          【讨论】:

            【解决方案8】:

            我认为,如果您使用来自片段的意图并且如果您使用 getActivity() 确保您已将片段附加到您的活动,否则它可能会抛出空指针。 因此,在我的情况下,我使用了一种解决方法来获取上下文,您可以使用它

            创建一个全局变量 View rootView 并初始化它 OnViewCreated() method ,您可以相应地使用。

            public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode != Activity.RESULT_OK) {
                return;
            }
            
            if (requestCode == REQUEST_IMAGE_CAPTURE) {
            Log.d(UploadPicturesFragment.class.getSimpleName(),
                        "IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap( rootView.getContext().getContentResolver(),
                            mHighQualityImageUri);
                    DroomUtil.beginCrop(mHighQualityImageUri, rootView.getContext(), this, true, bitmap.getWidth(),
                            bitmap.getHeight());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-05-07
              • 2019-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多