Я не могу сохранить захваченное камерой изображение независимо от того, что я делаю. Как это сделать? - PullRequest
0 голосов
/ 30 апреля 2020

Я следовал всему до точки с этого официального Android сайта.

Я сохранил путь createTempFile() в currentImagePath в своем коде. Печать, которая показывает путь. Однако, похоже, что по этому пути нет данных.

Мой лог c предназначен для копирования данных с этого пути в постоянный путь.

btnTakePic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                captureImage(v);
                /*try {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }*/

                //System.out.println(currentImagePath);
                File from = new File(currentImagePath);
                File storageFileDir = getFilesDir();
                byte[] bArray = new byte[(int) from.length()];
                try{
                    fi = new FileInputStream(from);
                    fi.read(bArray);
                    fi.close();

                }catch(IOException ioExp){
                    ioExp.printStackTrace();
                }
                File picStorageDir = new File(storageFileDir,"myPics");
                perStorageDir = picStorageDir;
                if(!picStorageDir.isDirectory())
                {
                    picStorageDir.mkdirs();
                }
                System.out.println(perStorageDir.getAbsolutePath());
                System.out.println("From length: "+from.length());
                try {
                    String[] t = currentImagePath.split("/"); // this is just to get image name
                    File temp = new File(picStorageDir,t[t.length-1]); // this is to set file with image name
                    ff = new FileOutputStream(temp);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                try {
                    ff.write(bArray);
                } catch (IOException e) {
                    e.printStackTrace();
                }
});

Ниже приведен метод captureImage()

public void captureImage(View view)
    {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if(cameraIntent.resolveActivity(getPackageManager())!=null)
        {
            File imageFile = null;
            try {
                imageFile = getImageFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(imageFile!=null)
            {
                Uri imageUri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", imageFile);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(cameraIntent, IMAGE_REQUEST);
            }
            System.out.println("imageFile length:"+imageFile.length());

        }

    }

Это вывод журнала

2020-04-30 14:19:32.646 31226-31226/com.example.ccalculator I/System.out: currImPath: /storage/emulated/0/Android/data/com.example.ccalculator/files/Pictures/jpg_20200430_1419032_793088582.jpg
2020-04-30 14:19:32.657 31226-31226/com.example.ccalculator I/System.out: imageFile length:0
2020-04-30 14:19:32.657 31226-31226/com.example.ccalculator I/System.out: /storage/emulated/0/Android/data/com.example.ccalculator/files/Pictures/jpg_20200430_1419032_793088582.jpg
2020-04-30 14:19:32.658 31226-31226/com.example.ccalculator I/System.out: permanent storage dir: /data/user/0/com.example.ccalculator/files/myPics
2020-04-30 14:19:32.658 31226-31226/com.example.ccalculator I/System.out: From length: 0

На данный момент мне еще предстоит захватить изображение из приложения. Поэтому я подумал, может быть, когда я получу изображение, данные будут сохранены по соответствующим путям. Я попытался добавить Thread.sleep(1000);, но даже это не помогает.

1 Ответ

0 голосов
/ 30 апреля 2020

Захват возвращается при обратном вызове, т.е. startActivityForResult не приостанавливает поток, поэтому добавьте что-то вроде ...

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == IMAGE_REQUEST && resultCode == RESULT_OK) {

Поместите свой код для обработки нового изображения в обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...