onActivityResult не возвращает видеоданные, эмулируемые в moto g6 - PullRequest
0 голосов
/ 04 марта 2020

У меня большая проблема, я искал ответ и не получил его. если эмулировать в эмуляторе по умолчанию из Android Studio и onActivityResult вернул цель для моей видеозаписи, когда я эмулирую в телефоне Motorola g 6 с android 9, он ничего не возвращает.

здесь мой код ...

private void record() {
    Intent intent=new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    if(intent.resolveActivity(getActivity().getPackageManager())!=null){
         new_video_file=getFilePath();
        Uri uri = FileProvider.getUriForFile(getActivity(),
                BuildConfig.APPLICATION_ID + ".provider",new_video_file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent,VIDEO_REQUEST);

    }
}

OnActivityForResult ....

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

    if (requestCode == VIDEO_REQUEST && resultCode == RESULT_OK) {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("CitaTestDrive");
        query.getInBackground(idEventoTestDrive, new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
                videoUri = data.getData();
                String file = videoUri.getPath();
                File inputFile = new File(file);

                try {
                    fileInputStream = new FileInputStream(inputFile);
                } catch (FileNotFoundException ex) {
                    ex.printStackTrace();
                }
                Bitmap thumbnailBm = BitmapFactory.decodeStream(fileInputStream);
                ByteArrayOutputStream st = new ByteArrayOutputStream();
                thumbnailBm.compress(Bitmap.CompressFormat.JPEG, 50, st);
                byte[] byteArr = st.toByteArray();
                Date currentTime = Calendar.getInstance().getTime();

                ParseFile thumbFile = new ParseFile("TestDrive" + " " + currentTime + " " + nombreAsesor + ".jpg", byteArr);
                object.put("Video", thumbFile);
                object.saveInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {
                        if (e == null) {
                            Toast.makeText(getActivity(), "Video uploaded to server", Toast.LENGTH_LONG).show();
                        } else {
                            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
                        }
                    }
                });

получить метод пути к файлу ....

 private File getFilePath() {
    File folder = new File(getActivity().getExternalFilesDir(null), "test_drives");
    if (!folder.exists()) {
        folder.mkdir();
    }

    Date currentTime = Calendar.getInstance().getTime();

    video_file = new File(folder, "test_drives_" + currentTime + ".mp4");
    return video_file;
}

ОБНОВЛЕНИЕ ---- - Я сделал то, что вы предлагаете, чтобы получить путь Ури. и ....

Update

Также заблокируйте, как я получил путь

enter image description here

Ответы [ 4 ]

0 голосов
/ 14 марта 2020

В моем случае я использовал библиотеку EasyImagePicker. Это очень легко использовать для выбора изображений или видео или любого другого документа из галереи или файлового менеджера. Ниже приведена реализация:

реализация 'com.github.jkwiecien: EasyImage: 2.1.1'

Вы можете увидеть шаги реализации по ссылке ниже:

https://github.com/jkwiecien/EasyImage

Убедитесь, что вам необходимо получить разрешение от пользователя или установить разрешение в файле манифеста.

EasyImage.openChooserWithGallery(DoctorRegisterLastActivity.this,"Select Video", 1);

Ниже приведен код onActivityResult:

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

        EasyImage.handleActivityResult(requestCode, resultCode, data, DoctorRegisterLastActivity.this, new DefaultCallback() {
            @Override
            public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) {
            }

            @Override
            public void onImagesPicked(@NonNull List<File> imageFiles, EasyImage.ImageSource source, int type) {
                if (!imageFiles.isEmpty()) {
                    if (type == 1) {

                       Glide.with(mContext)
                            .load(imageFiles.get(0).getPath())
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .placeholder(R.drawable.ic_logo_green)
                            .into(iv_featured_cover);

                    }
                }
            }

            @Override
            public void onCanceled(EasyImage.ImageSource source, int type) {
                if (source == EasyImage.ImageSource.CAMERA_IMAGE) {
                    File photoFile = EasyImage.lastlyTakenButCanceledPhoto(LastActivity.this);
                    if (photoFile != null) photoFile.delete();
                }
            }
        });
    }
0 голосов
/ 13 марта 2020

Замените своим кодом OnActivityForResult.

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

    if (requestCode == VIDEO_REQUEST && resultCode == RESULT_OK) {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("CitaTestDrive");
        query.getInBackground(idEventoTestDrive, new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
                videoUri = data.getData();
                String file = videoUri.getPath();
                File inputFile = new File(file);

                try {
                    fileInputStream = new FileInputStream(inputFile);
                } catch (FileNotFoundException ex) {
                    ex.printStackTrace();
                }
                Bitmap thumbnailBm = BitmapFactory.decodeStream(fileInputStream);
                ByteArrayOutputStream st = new ByteArrayOutputStream();
                thumbnailBm.compress(Bitmap.CompressFormat.JPEG, 50, st);
                byte[] byteArr = st.toByteArray();
                Date currentTime = Calendar.getInstance().getTime();

                ParseFile thumbFile = new ParseFile("TestDrive" + " " + currentTime + " " + nombreAsesor + ".jpg", byteArr);
                object.put("Video", thumbFile);
                object.saveInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {
                        if (e == null) {
                            Toast.makeText(getActivity(), "Video uploaded to server", Toast.LENGTH_LONG).show();
                        } else {
                            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
                        }
                    }
                });

попробуйте этот код и дайте мне знать, работает ли он или нет.

0 голосов
/ 13 марта 2020

Сначала создайте файл, в котором будут храниться необработанные данные видео, затем используйте этот файл, чтобы получить путь для воспроизведения этого видео.

Вот синтаксис basi c:

private static final int REQUEST_VIDEO_CAPTURE = 300;

private Uri videoUri;

private void dispatchVideoIntent(){
    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    File outputFile = new File("your file path goes here");
    videoUri = FileProvider.getUriForFile(getActivity(),  
     BuildConfig.APPLICATION_ID + ".provider",new_video_file);
    takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
    if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK && videoUri != null) {
            // do what you want with videoUri
    }
} 

Ссылка https://developer.android.com/training/camera/videobasics

0 голосов
/ 05 марта 2020
private fun getRealPathFromURI(contentURI: Uri): String? {
val result: String?
val cursor = contentResolver.query(contentURI, null, null, null, null)
if (cursor == null) { // Source is Dropbox or other similar local file path
    result = contentURI.path
} else {
    cursor.moveToFirst()
    val idx = cursor.getColumnIndex(MediaStore.Images.Media.DATA)
    result = cursor.getString(idx)
    cursor.close()
}
return result
}

val file: File = File(getRealPathFromURI(Uri.parse(imagePath)))

попробуйте это, чтобы получить реальный путь к файлу

...