2016-09-21 64 views
2
final List<Intent> cameraIntents = new ArrayList<Intent>(); 
       final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       final PackageManager packageManager = getPackageManager(); 
       final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
       for (ResolveInfo res : listCam) { 
        final String packageName = res.activityInfo.packageName; 
        final Intent intent = new Intent(captureIntent); 
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
        intent.setPackage(packageName); 
        cameraIntents.add(intent); 
       } 
       Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 
       final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 
       chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{})); 
       startActivityForResult(chooserIntent, 1); 

所以,這就是我怎麼叫,即可開啓相機或拍照。我如何在onactivityresult上閱讀它們?檢查下面的代碼。問題是,從照片中選擇的圖像起作用時,從相機拍攝它的作品。但是,從圖庫文件夾中選擇時,由於某種原因它不起作用。還有一些客戶在索尼xperia e4手機上報告我的問題。形象並不總是工作

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 
     if (resultCode == Activity.RESULT_OK && requestCode == 1 
       ) { 
      Bitmap bm = null; 
      try 
      { 
       Bundle extras = data.getExtras(); 
       bm = (Bitmap) extras.get("data"); 
      } 
      catch(Exception e) 
      { 
       try 
       { 
        Uri selectedImage = data.getData(); 
        BitmapFactory.Options options = new BitmapFactory.Options(); 
        options.inJustDecodeBounds = false; 
        options.inPreferredConfig = Bitmap.Config.RGB_565; 
        options.inDither = true; 
        String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
        Cursor cursor = getContentResolver().query(
          selectedImage, filePathColumn, null, null, null); 
        cursor.moveToFirst(); 
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
        String filePath = cursor.getString(columnIndex); 
        cursor.close(); 
        Common.setBitmap(null); 
        bm = BitmapFactory.decodeFile(filePath);   
    BitmapFactory.decodeFile(Common.getRealPathFromURI(data.getData(), rootView.getContext()), bounds); 
        if(bm == null) 
         bm = BitmapFactory.decodeFile(Common.getRealPathFromURI(selectedImage, AddStoreActivity.this), options); 
        if(bm == null) 
         bm = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage); 
       } 
       catch(Exception e1) 
       { 
       } 
      }   
     } 
    } catch (Exception e) { 
    } 
} 





public static String getRealPathFromURI(Uri contentURI, Context cont) { 
    Cursor cursor = cont.getContentResolver().query(contentURI, null, null, null, null); 
    if (cursor == null) { // Source is Dropbox or other similar local file path 
     return contentURI.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     int idx = cursor.getColumnIndex(MediaColumns.DATA); 
     return cursor.getString(idx); 
    } 
} 

回答

0

我這是怎麼做到這一點,它的工作原理:

private void displayAddPhotoDialog() { 
     final CharSequence[] items = getResources().getStringArray(R.array.photo_dialog_options); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(getResources().getString(R.string.photo_dialog_title)); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int item) { 
       if (item == TAKE_PHOTO_OPTION) { 
        dispatchTakePictureIntent(); 
       } else if (item == CHOOSE_FROM_LIBRARY_OPTION) { 
        dispatchPickImageIntent(); 
       } else if (item == CANCEL_OPTION) { 
        dialog.dismiss(); 
       } 
      } 
     }); 
     builder.show(); 
    } 


protected void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
       imageUri = Uri.fromFile(photoFile); 
      } catch (IOException ex) { 
       Toast.makeText(getActivity(), ex.toString(), Toast.LENGTH_SHORT).show(); 
      } 
      if (photoFile != null) { 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
       startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE); 
      } 
     } else { 
      Toast.makeText(getActivity(), R.string.no_camera_error_message, Toast.LENGTH_SHORT).show(); 
     } 
    } 


    protected void dispatchPickImageIntent() { 
     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
     } else { 
      intent.setAction(Intent.ACTION_OPEN_DOCUMENT); 
     } 
     startActivityForResult(Intent.createChooser(intent, getString(R.string.select_picture)), GALLERY_REQUEST_CODE); 
    } 

而且你的onActivityResult方法應該是這樣的:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 
      photoReceivedFromCamera = true; 
      getActivity().getContentResolver().notifyChange(imageUri, null); 
      Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
      mediaScanIntent.setData(imageUri); 
      getActivity().sendBroadcast(mediaScanIntent); 
      //do want you want with the uri(taken photo) 
     } else if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_CANCELED) { 
      //The user cancelled the take picture action... 
      if (!photoReceivedFromCamera) { 
       //If the user has not previously taken a picture, 
       //this means he is cancelling the take photo process 
       onCancelTakePicture(); 
      } 
     } else if (requestCode == GALLERY_REQUEST_CODE && data != null && data.getData() != null) { 
      Uri uri = data.getData(); 
      //do want you want with the uri(selected image) 
     } 
    }