【问题标题】:startActivityForResult in fragment片段中的 startActivityForResult
【发布时间】:2016-09-04 21:07:21
【问题描述】:

我有两个问题:

首先:我想知道方法 2 的不同之处,因为当我使用方法 1 时,我的应用程序运行正常,但我更改方法 2 它无法运行.. 方法一(简单拍照):

    private void takePhoto() {

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    Log.d(TAG, "Take photo .......");

    startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}

还有方法二:

  public void dispathTakepictureIntent() {

  Context context = getActivity();

    PackageManager packageManager = context.getPackageManager();

    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)                    ==false)
                 {
        Toast.makeText(getActivity()
       , "This device does not have a camera.", Toast.LENGTH_SHORT).show();
        return;
    }
       else 
        {
        Intent takePictureIntent = new                   Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) 
               {  
            File photoFile = null;
            try {
                photoFile = createCurrentPhotoPath();

                } 
                catch (IOException ex) 
                   {

                Toast.makeText(getActivity(), "null photo Path", Toast.LENGTH_LONG).show();
            }

            if (photoFile != null) {
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));

                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);

            }
        }
    }

}

---相机片段的onActivityResult:

 @Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) {

            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            if (imageBitmap != null)
                Img_show.setImageBitmap(imageBitmap);
            else
                Toast.makeText(getActivity(), "null photo bitmap", Toast.LENGTH_LONG).show();

        } else
            Toast.makeText(getActivity(), "Cancel !", Toast.LENGTH_LONG).show();


    }

主要问题:现在我有 MainFragment 扩展 FragmentActivity(有片段相机和地图)。但是当我在片段相机中

startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);

然后在onActivityResult方法中,resultCode总是==0,虽然它必须==1; .谁可以显示我的问题???我哪里错了??

注意 mainFragment 我只是调用:

@Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

    }

谢谢

【问题讨论】:

    标签: android fragment onactivityresult startactivityforresult


    【解决方案1】:

    这样试试……

         private static final int REQUEST_CAMERA = 2;
    
        if (isDeviceSupportCamera()) {
                            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            startActivityForResult(intent, REQUEST_CAMERA);
                        } else {
                            showCustomToast(" No camera on this device !!");
                        }
         private boolean isDeviceSupportCamera() {
                if (getActivity().getApplicationContext().getPackageManager().hasSystemFeature(
                        PackageManager.FEATURE_CAMERA)) {
                    // this device has a camera
                    return true;
                } else {
                    // no camera on this device
                    return false;
                }
            }
         @Override
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
    
                if (requestCode == REQUEST_CAMERA && resultCode == getActivity().RESULT_OK && null != data) {
                    Bitmap photo = (Bitmap) data.getExtras().get("data");
                    profileImage.setImageBitmap(photo);
    
                    // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
                    Uri tempUri = getImageUri(getActivity().getApplicationContext(), photo);
    
                    // CALL THIS METHOD TO GET THE ACTUAL PATH
                    File finalFile = new File(getRealPathFromURI(tempUri));
                    decodeFile(finalFile.toString());
                }
            }
     public Uri getImageUri(Context inContext, Bitmap inImage) {
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
            return Uri.parse(path);
        }
    
        public String getRealPathFromURI(Uri uri) {
            Cursor cursor = getActivity().getContentResolver().query(uri, null, null, null, null);
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            return cursor.getString(idx);
        }
    
    
        // decode image
        public void decodeFile(String filePath) {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(filePath, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = 1024;
            // Find the correct scale value. It should be the power of 2.
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale *= 2;
            }
    
            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            bitmap = BitmapFactory.decodeFile(filePath, o2);       
            profileImage.setImageBitmap(bitmap);
        }
    

    这只是一个经过全面测试的完整示例,它肯定可以帮助您从相机拍照......并且像魅力一样工作......

    【讨论】:

    • 它仍然被拒绝。因为当我调试时,我在 caemra 片段 ==0 上看到了 resultCode; (吐司=取消)。我认为我在 startActivityForResult 和 onActivityResult 的问题。
    • @AceAkatsuki..okay...现在告诉我您解决此问题的主要关注点,或者您可以使用其他一些运行效率更高的代码
    • @AceAkatsuki...我已经更新了我的答案,这肯定对你有帮助
    • 你的代码很棒。如您所知,resultCode == getActivity().RESULT_OK 必须返回 =1 。但是当我运行调试 resultCode == getActivity().RESULT_OK =0 时,我拍照后我没有取消它,然后它无法保存,获取图像...等等..这是我的问题。我不知道为什么也不明白。
    • @AceAkatsuki 因为您在检查相机功能时在 if else 条件下做错了(相反)...
    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多