【问题标题】:onActivityResult doesnt return Intent running on a Physical deviceonActivityResult 不返回在物理设备上运行的 Intent
【发布时间】:2020-03-04 12:33:19
【问题描述】:

当使用相机 Intent 从我的 android 模拟器拍摄视频时,onActivityResult 返回了我的视频录制的 Intent。但是如果我从我的 moto g6 物理设备制作它,则 Intent 将返回 null(如某些图像所示. 我会插入我的代码给你一个更好的画面。

这是我的代码...

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;
}

更新----- 我按照你的建议来获取uri路径。和....

还要锁定我是如何获得路径的

【问题讨论】:

  • 显示您的 onActivityResultCode 和完整代码
  • 我更新了您要求 Amit 的方法的帖子
  • 您好 Felipe,当您使用提供程序时,data.getData() 始终返回 null。您必须使用您在 func record() 中创建的“uri”
  • 嗨,kasim,我不明白我需要获取数据才能将视频上传到服务器。
  • 您的记录功能已经正确。您需要编辑 onActivityResult。

标签: android android-camera-intent google-developers-console


【解决方案1】:
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)))

试试这个以获得文件的真实路径

【讨论】:

  • 你好,你能用java做吗?
【解决方案2】:

就我而言,我使用了 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();
                }
            }
        });
    }

【讨论】:

    【解决方案3】:

    替换为您的 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();
                            }
                        }
                    });
    

    试试这个代码,让我知道它是否有效。

    【讨论】:

    • 您好 Praful,您在与我的代码相关的这段代码中进行了哪些更改?
    • @FelipeFranco 我改了videoUri = data.getData();这一行。
    • 你好 Praful 这条线是什么,它来自 videoUri = new_video_file;
    • @FelipeFranco 现在我正在编辑此行,请检查。
    【解决方案4】:

    首先,创建将存储视频原始数据的文件,然后使用该文件获取播放该视频的路径。

    这是基本语法:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2013-01-11
      • 2014-12-09
      • 1970-01-01
      相关资源
      最近更新 更多