Android-图片裁剪无法加载图片

时间:2019-10-27 11:50:41

标签: java android android-studio ucrop

我想剪切从画廊或相机拍摄的照片。但是我看不到裁剪活动中的照片。只是没有来。我从相机拍摄一张照片,然后开始切割活动。屏幕看起来像这样:

enter image description here

相机和onActivityResult

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
                Log.d("FotografHata",""+ex);
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(this,
                        "com.maksu.aquarium.fileprovider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    }

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        Uri uri = Uri.parse(currentPhotoPath);
        openCropActivity(uri, uri);
    } else if (requestCode == UCrop.REQUEST_CROP && resultCode == RESULT_OK) {
        Uri uri = UCrop.getOutput(data);
    }
}

openCropActivity

private void openCropActivity(Uri girenUri, Uri cikanUri) {
    UCrop.of(girenUri, cikanUri)
            .withAspectRatio(16, 9)
            .start(this);
}

2 个答案:

答案 0 :(得分:2)

解决方案:

我正在使用多选器库使用画廊照片和挑选照片。选择照片后,我打开的照片是 ucrop库

>

放在您项目的班级下面。

遵循代码:

private String filePath;
private ImagePicker imagePicker;
private CameraImagePicker cameraImagePicker;

private void pickImage() {
        //showProgressBarWithoutHide();

        if (AppUtils.isValidContext(activity)) {
            imagePicker = new ImagePicker(activity);
            imagePicker.setImagePickerCallback(pickerCallback);
            //imagePicker.allowMultiple(); // Default is false
            imagePicker.shouldGenerateMetadata(false); // Default is true
            imagePicker.shouldGenerateThumbnails(false); // Default is true
            imagePicker.pickImage();
        }
    }

    private void cameraImg() {

        if (AppUtils.isValidContext(activity)) {
            if (!SystemUtils.checkForCamera(activity)) {
                Snackbar.make(btnAddToGallery, "Your device doesn't support camera", Snackbar.LENGTH_LONG).show();
                return;
            }
            cameraImagePicker = new CameraImagePicker(activity);
            cameraImagePicker.setImagePickerCallback(pickerCallback);
            cameraImagePicker.shouldGenerateMetadata(false); // Default is true
            cameraImagePicker.shouldGenerateThumbnails(false); // Default is true
            filePath = cameraImagePicker.pickImage();

            Log.i(TAG, "filepath: " + filePath);
        }
    }

 ImagePickerCallback pickerCallback = new ImagePickerCallback() {
    @Override
    public void onImagesChosen(List<ChosenImage> list) {
        try {
            Log.i(TAG, "onImagesChosen() " + list.size());

            if (list.size() == 0) {
                Snackbar.make(btnAddToGallery, R.string.err_failed_to_pick_img, Snackbar.LENGTH_LONG).show();
                return;
            }
            final ChosenImage chosenImage = list.get(0);


            if (AppUtils.isValidContext(activity) && isAdded()) {
                activity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        if (chosenImage != null) {
                            Log.i(TAG, "getOriginalPath Path:" + chosenImage.getOriginalPath());

                            validateImagePath(chosenImage.getOriginalPath());

                        } else {
                            //hideProgressBar();
                            Snackbar.make(btnAddToGallery, "Failed to choose image", Snackbar.LENGTH_LONG).show();
                            Log.e(TAG, "Failed to choose image");
                        }
                    }
                });
            }
        } catch (Throwable th) {
            th.printStackTrace();
        }
    }

    @Override
    public void onError(String s) {

        //hideProgressBar();
    }


};

private void validateImagePath(String imagePath) {
    String ext = FileUtils.getFileExtension(imagePath);

    Log.i(TAG, "EXT: " + ext);
    if (ext.equals("jpg") || ext.equals("png") || ext.equals("jpeg")) {

        if (imagePath != null) {

            File file = new File(imagePath);
            long length = file.length();

            Log.i(TAG, "File size is: " + length);
            if (length > Constants.MAX_IMAGE_FILE_SIZE) {
                //hideProgressBar();
                Snackbar.make(btnAddToGallery, getString(R.string.err_img_too_large), Snackbar.LENGTH_LONG).show();
                FileUtils.deleteFileFromPath(filePath);
                return;
            }

            filePath = imagePath;
            PerformCrop();

        } else {
            //hideProgressBar();
            Toast.makeText(activity, R.string.err_failed_to_pick_img, Toast.LENGTH_SHORT).show();
        }
    } else {
        //hideProgressBar();
        Snackbar.make(btnAddToGallery, "Please select valid file.", Snackbar.LENGTH_LONG).show();
        Log.e(TAG, "Please select valid file");
    }
}

openCropActivity:

private void PerformCrop() {            
        try {
            Uri sourceUri = Uri.parse("file://" + filePath);
            Uri destUri = Uri.fromFile(new File(activity.getFilesDir(), "U_Crop_Image_" + System.currentTimeMillis() + ".png")); 

            UCrop uCrop = UCrop.of(sourceUri, destUri); //Uri.fromFile(new File(getCacheDir(), destinationFileName))

            uCrop = basisConfig(uCrop);
            uCrop = advancedConfig(uCrop);

            uCrop.start(activity);

        } catch (Throwable e) {
            e.printStackTrace();
        }

    }

onActivityResult:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case Picker.PICK_IMAGE_DEVICE:

                if (resultCode == Activity.RESULT_OK && data != null) {

                    if (imagePicker == null && AppUtils.isValidContext(activity)) {
                        imagePicker = new ImagePicker(activity);
                        imagePicker.setImagePickerCallback(pickerCallback);
                    }
                    if (imagePicker != null) {
                        imagePicker.submit(data);
                    }
                } else {
                    Log.e(TAG, "PICK_IMAGE_DEVICE intent is null or result code is " + resultCode);
                }

                break;
            case Picker.PICK_IMAGE_CAMERA:

                if (resultCode == Activity.RESULT_OK && data != null) {

                    if (cameraImagePicker == null && AppUtils.isValidContext(activity)) {
                        cameraImagePicker = new CameraImagePicker(activity);
                        cameraImagePicker.reinitialize(filePath);
                        // OR in one statement
                        // imagePicker = new CameraImagePicker(Activity.getActivity(), outputPath);
                        cameraImagePicker.setImagePickerCallback(pickerCallback);
                    }
                    if (cameraImagePicker != null) {
                        cameraImagePicker.submit(data);
                    }
                } else {
                    Log.e(TAG, "PICK_IMAGE_CAMERA intent is null or result code is " + resultCode);
                    if (filePath != null && filePath.length() > 0) {
                        PerformCrop();
                    } else {
                        Snackbar.make(btnAddToGallery, R.string.err_failed_to_pick_img, Snackbar.LENGTH_LONG).show();
                    }

                }

                break;
            case UCrop.REQUEST_CROP:
                if (resultCode == Activity.RESULT_OK) {
                    final Uri resultUri = UCrop.getOutput(data);
                    Log.e(TAG, "Cropped image: " + resultUri);

                    try {
                        if (resultUri != null && resultUri.toString().length() > 0) {
                            /* Remove dummy image */
//                            set crop Image... 
                        }
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }

                    //showCropAd();

                } else if (resultCode == UCrop.RESULT_ERROR) {

                    try {
                        final Throwable cropError = UCrop.getError(data);
                        if (cropError != null && cropError.getMessage() != null) {
                            Log.e(TAG, "cropError: " + cropError.getMessage());
                        }
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }

                break;
          }
    }

结果:

我的应用程序演示跟随图像:

enter image description here

enter image description here enter image description here

此代码仅供您参考。如果您仍然遇到任何问题,请告诉我。很高兴为您服务。

答案 1 :(得分:0)

我通过使用 @page "/results" @inject Blazored.LocalStorage.ISyncLocalStorageService localStore @inject IJSRuntime JSRuntime; @inject Toolbelt.Blazor.I18nText.I18nText I18nText <h1>@Language.T8</h1> <div> <div class="row"> <div class="column" id="chartColumn" style="width:80%;text-align:center"> <canvas id="myChart"></canvas> </div> <div class="column" style="width:20%;text-align:center;font-size:1.5vw"> <br /> <br /> <br /> <br /> <span> @ResultInText <br /> </span> <h1 style="font-weight:bolder">@FilterSavings</h1> <br /> <br /> <span> @WasteTextPaper<br /> @WasteTextPlastic </span> @if (SelectedChartCategory == 13) { <br /> <br /> <br /> <br /> <br /> } <span style="font-size:0.4vw">@DisclaimerText</span> </div> </div> <hr /> <div class="row"> <div class="column" style="width:30%"> <b>@Language.T33</b> </div> <div class="column" style="width:70%"> <b>@Language.T34</b> </div> </div> <div class="row"> <div class="column" style="width:30%"> <div class="btn-group"> <button type="button" class="btn btn-primary" style="outline-color:red" @onclick="() => UpdateTheChart(11)">@Language.T35</button> <button type="button" class="btn btn-primary" @onclick="() => UpdateTheChart(12)">@Language.T36</button> <button type="button" class="btn btn-primary" @onclick="() => UpdateTheChart(13)">@Language.T37</button> </div> </div> <div class="column" style="width:70%"> <div class="btn-group"> <button type="button" class="btn btn-primary" @onclick="() => UpdateTheChart(21)">@Language.T138</button> <button type="button" class="btn btn-primary" @onclick="() => UpdateTheChart(22)">@Language.T38</button> <button type="button" class="btn btn-primary" @onclick="() => UpdateTheChart(23)">@Language.T39</button> <button type="button" class="btn btn-primary" @onclick="() => UpdateTheChart(24)">@Language.T40</button> </div> </div> </div> </div> @code {//handles initialization I18nText.Language Language = new I18nText.Language(); List<float> retResultMHC = null; List<float> retResultCom = null; string retResultMHCProduct = ""; string retResultCOMProduct = ""; double retResultCostSavings = 0; double retResultTimeSavings = 0; double retResultWasteReduction = 0; double retResultWastePaper = 0; double retResultWastePlastic = 0; string retResultWasteFlag = ""; string retResultCostFlag = ""; string retResultTimeFlag = ""; string FilterSavings = ""; string WasteTextPaper = ""; string WasteTextPlastic = ""; string retCurrency = ""; string DisclaimerText = ""; string ResultInText = "Cost savings for all patients during a year"; int SelectedChartCategory = 11; int SelectedChartPeriod = 24; int CalChartPeriod = 1; string SelectedResultFlag = "savings"; string PeriodUOM = "year"; protected override void OnInitialized() { InitializeLocalStorage(); if (retResultMHC != null && retResultCom != null) { UpdateTheChart(11); } } protected override async Task OnInitializedAsync() { Language = await I18nText.GetTextTableAsync<I18nText.Language>(this); ResultInText = Language.T118 + Language.T127; } private void InitializeLocalStorage() { retResultMHCProduct = localStore.GetItemAsString("Result-MHC-Product"); retResultCOMProduct = localStore.GetItemAsString("Result-COM-Product"); retResultMHC = localStore.GetItem<List<float>>("Result-MHC"); retResultCom = localStore.GetItem<List<float>>("Result-COM"); retResultCostSavings = localStore.GetItem<double>("Result-Cost-Savings"); retResultTimeSavings = localStore.GetItem<double>("Result-Time-Savings"); retResultWasteReduction = localStore.GetItem<double>("Result-Waste-Reduction"); retResultCostFlag = localStore.GetItemAsString("Result-Cost-Flag"); retResultTimeFlag = localStore.GetItemAsString("Result-Time-Flag"); retResultWasteFlag = localStore.GetItemAsString("Result-Waste-Flag"); retResultWastePaper = localStore.GetItem<double>("Result-Waste-Paper"); retResultWastePlastic = localStore.GetItem<double>("Result-Waste-Plastic"); retCurrency = localStore.GetItemAsString("CurrencyKey"); } } @code{//handles chart private IJSObjectReference _jsModule; //this will be the live code private async Task UpdateTheChart(int clickedButton) { //assign the selected parameters if (clickedButton == 11 || clickedButton == 12 || clickedButton == 13) SelectedChartCategory = clickedButton; else SelectedChartPeriod = clickedButton; if (SelectedChartPeriod == 21) { PeriodUOM = Language.T124; CalChartPeriod = 365; } else if (SelectedChartPeriod == 22) { PeriodUOM = Language.T125; CalChartPeriod = 52; } else if (SelectedChartPeriod == 23) { PeriodUOM = Language.T126; CalChartPeriod = 12; } else if (SelectedChartPeriod == 24) { PeriodUOM = Language.T127; CalChartPeriod = 1; } else { PeriodUOM = Language.T127; CalChartPeriod = 1; } ResultInText = ""; //things to do before showing the selected chart if (SelectedChartCategory == 11) { if (retResultCostFlag == "savings") ResultInText = Language.T118 + PeriodUOM; else ResultInText = Language.T119 + PeriodUOM; WasteTextPaper = ""; WasteTextPlastic = ""; FilterSavings = string.Format(retCurrency + "{0:n0}", retResultCostSavings / CalChartPeriod); DisclaimerText = ""; } else if (SelectedChartCategory == 12) { if (retResultCostFlag == "savings") ResultInText = Language.T120 + PeriodUOM; else ResultInText = Language.T121 + PeriodUOM; WasteTextPaper = ""; WasteTextPlastic = ""; FilterSavings = string.Format("{0:n0}", retResultTimeSavings / CalChartPeriod) + " " + Language.T134; DisclaimerText = ""; } else if (SelectedChartCategory == 13) { if (retResultCostFlag == "reduction") ResultInText = Language.T122 + PeriodUOM; else ResultInText = Language.T123 + PeriodUOM; WasteTextPaper = Language.T128 + string.Format("{0:n2}", retResultWastePaper / CalChartPeriod) + " " + Language.T135; WasteTextPlastic = Language.T129 + string.Format("{0:n2}", retResultWastePlastic / CalChartPeriod) + " " + Language.T135; FilterSavings = string.Format("{0:n2}", retResultWasteReduction / CalChartPeriod) + " " + Language.T135; DisclaimerText = Language.T136; } //calling js to make the chart _jsModule = await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./scripts/MakeChart.js"); if (SelectedChartCategory == 11) { await _jsModule.InvokeVoidAsync("showChartCost", CalChartPeriod, Language.T131, Language.T132, Language.T133); } else if (SelectedChartCategory == 12) { await _jsModule.InvokeVoidAsync("showChartTime", CalChartPeriod, Language.T130); } else { await _jsModule.InvokeVoidAsync("ShowChartPic"); } } } 传递源和目标 Uri 所以它一直在加载

对我有用的是我使用了 Uri.parse(myFile),就像这样

toUri()
相关问题