【问题标题】:Android: How to pass uri from onActivity result to another method?Android:如何将 uri 从 onActivityresult 传递给另一个方法?
【发布时间】:2015-12-01 04:15:09
【问题描述】:

如何将 onActivity 结果中的 uri 传递给同一个 jave 文件中的另一个方法。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) return;

    if (requestCode == PICK_FROM_GALLERY) {
        Uri mVideoURI = data.getData();
        videoView.setVideoURI(mVideoURI);
        videoView.start();
    }

}

方法保存视频:

public void savevideo() {


String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SavedVideo/";
    File dir = new File(path);
    if(!dir.exists())
        dir.mkdirs();;
    // create unique identifier
    Random generator = new Random();
    int n = 100;
    n = generator.nextInt(n);
    // create file name
    String videoName = "Video_" + n + ".mp4";
    File fileVideo = new File(dir.getAbsolutePath(), videoName);

    try {
        fileVideo.createNewFile();
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (success) {
        Toast.makeText(getApplicationContext(), "Video saved!",
                Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(getApplicationContext(),
                "Error during video saving", Toast.LENGTH_LONG).show();
    }

    return true;

}

}

我想将 mVideoURI 传递给 savevideo 方法,然后将视频 uri 保存到图库中。有人可以帮我弄这个吗。任何指导/建议都会非常有帮助。谢谢。

已编辑:完整编码:

public class AndroidVideoPlayer extends Activity {

Button button;
VideoView videoView;
private static final int PICK_FROM_GALLERY = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_android_video_player);

    button = (Button) findViewById(R.id.button);

    videoView = (VideoView) findViewById(R.id.videoview);

    button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent();

            intent.setType("video/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);

            startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_GALLERY);
        }
    });

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) return;

    if (requestCode == PICK_FROM_GALLERY) {
        Uri mVideoURI = data.getData();
        savevideo(mVideoURI);
        videoView.setVideoURI(mVideoURI);
        videoView.start();
    }

}
public void savevideo(Uri mVideoURI) {


    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SavedVideo/";
    File dir = new File(path);
    if(!dir.exists())
        dir.mkdirs();;
    // create unique identifier
    Random generator = new Random();
    int n = 100;
    n = generator.nextInt(n);
    // create file name
    String videoName = "Video_" + n + ".mp4";
    File fileVideo = new File(dir.getAbsolutePath(), videoName);

    boolean success=false;
    try {
        fileVideo.createNewFile();
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (success) {
        Toast.makeText(getApplicationContext(), "Video saved!",
                Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(getApplicationContext(),
                "Error during video saving", Toast.LENGTH_LONG).show();
    }



}

}

【问题讨论】:

  • 你可以从onActivityResult调用saveVideo方法并传递Uri
  • saveVideo(mVideoURI) public void savevideo(Uri mVideoURI) ??

标签: android android-intent android-activity uri


【解决方案1】:

根据我对您问题的理解,您必须在从另一个活动中获得结果后调用一个方法。所以你可能会被称为startActivitForResult(activityB) 来获取视频 Uri。所以你会得到来自activityB的回调,因此你可以直接将视频传递给方法saveVideo(),因为它在同一个Activity中。

示例

   @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) 
      return;

    if (requestCode == PICK_FROM_GALLERY) {
        Uri mVideoURI = data.getData();
        saveVideo(videoUri);
    }
}

public void saveVideo(Uri videoUri){
  // do operations with uri
}

或者如果您不能接受saveVideo() 方法中的任何参数,您可以将uri 作为成员变量并使用inside() 方法

【讨论】:

  • 当我使用此方法执行时,视频保存在图库中,但我无法播放视频,因为它是 0kb..我的编码有问题吗?
【解决方案2】:

使用此代码-

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) return;

    if (requestCode == PICK_FROM_GALLERY) {
        Uri mVideoURI = data.getData();
        saveVideo(mVideoURI);                // methode to save uri gets called here
        videoView.setVideoURI(mVideoURI);
        videoView.start();
    }

}
method savevideo:

public void savevideo(Uri mVideoURI) {


String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SavedVideo/";
    File dir = new File(path);
    if(!dir.exists())
        dir.mkdirs();;
    // create unique identifier
    Random generator = new Random();
    int n = 100;
    n = generator.nextInt(n);
    // create file name
    String videoName = "Video_" + n + ".mp4";
    File fileVideo = new File(dir.getAbsolutePath(), videoName);

    try {
        fileVideo.createNewFile();
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (success) {
        Toast.makeText(getApplicationContext(), "Video saved!",
                Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(getApplicationContext(),
                "Error during video saving", Toast.LENGTH_LONG).show();
    }

    return true;

}

}

【讨论】:

  • 视频保存在图库中,但我无法播放视频..视频文件为 0kb..你知道为什么会这样吗? @sud
  • 这可能是因为您的文件没有成功保存在图库中,或者播放视频时您向播放器提供了错误的视频文件路径
  • 我已经添加了我的完整编码..你能指导我我在哪里犯了错误吗?我感觉有点失落。 @sud
  • [ public void savevideo(Uri mVideoURI) ] 中的 'mVideoURI' 以灰色突出显示,表示该参数从未使用过。
【解决方案3】:

在您的代码中,您只是在目标路径上创建新文件,而不是将源文件的数据写入目标文件。

所以你得到了 0KB 的文件。使用以下代码编写文件。

void savefile(URI sourceuri)
{
String sourceFilename= sourceuri.getPath();
String destinationFilename = android.os.Environment.getExternalStorageDirectory().getPath()+File.separatorChar+"abc.mp3";

BufferedInputStream bis = null;
BufferedOutputStream bos = null;

try {
  bis = new BufferedInputStream(new FileInputStream(sourceFilename));
  bos = new BufferedOutputStream(new FileOutputStream(destinationFilename, false));
  byte[] buf = new byte[1024];
  bis.read(buf);
  do {
    bos.write(buf);
  } while(bis.read(buf) != -1);
} catch (IOException e) {

} finally {
  try {
    if (bis != null) bis.close();
    if (bos != null) bos.close();
  } catch (IOException e) {

  }
}
}

【讨论】:

  • 我已经在你的答案中添加了我的编码..视频没有保存到指定的文件夹中?编码有什么问题吗? @Mayur Sakhiya
  • 是的,我上面的回答说在您的代码中,您忘记将视频数据写入保存的文件。请正确检查我的答案并执行上述代码以保存您的视频文件
  • 我完全按照您的回答期望我自定义了要保存的视频的位置..但它不起作用..@Mayur Sakhiya
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多