我正在尝试共享正在创建并存储在已获取其路径的外部SD卡上的视频。
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath()
我正在使用SEND_INTENT,如下所示:
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
shareIntent.setType("video/mp4");
shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Subject");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT,"My Text");
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(video_path));
startActivityForResult(Intent.createChooser(shareIntent, "Share Your Video"),SHARE_INTENT);
问题: 当我通过gmail分享时,它会显示我附带视频的撰写窗口。但是没有显示视频的大小,当您发送或取消窗口时,gmail将在内容解析器上与输入流NPE崩溃。
如果是youtube,它表示您无法从云服务上传视频,我的视频显然位于设备上。
在Facebook的情况下,它被默默地丢弃。这适用于wassup。 : - )
任何想法如何让这个工作?
编辑:
视频路径:
/storage/emulated/0/Movies/MyFolder/my-video_1378253389208.mp4
更新
通过添加file:///
后缀,gmail和facebook工作正常。
Youtube仍然在为#34;视频无法从云端服务上传#34;。
答案 0 :(得分:4)
Youtube失败和其他人工作的原因是因为它检查它是否是媒体文件。它只是认为它是一个媒体文件,如果它已被扫描。运行下面的代码,它应该工作。它也将出现在画廊中。如何上传我不知道的临时文件。
void publishScan() {
//mVidFnam: "/mnt/sdcard/DCIM/foo/vid_20131001_123738.3gp" (or such)
MediaScannerConnection.scanFile(this, new String[] { mVidFnam }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.d(TAG, "onScanCompleted uri " + uri);
}
});
}
答案 1 :(得分:2)
根据Johan vdH的回答,以下代码适用于许多共享应用程序,包括Youtube,Facebook,WhatsApp等。
路径应该是视频文件的绝对路径。例如。 “/mnt/sdcard/DCIM/foo/vid_20131001_123738.3gp”
public void shareVideo(final String title, String path) {
MediaScannerConnection.scanFile(getActivity(), new String[] { path },
null, new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Intent shareIntent = new Intent(
android.content.Intent.ACTION_SEND);
shareIntent.setType("video/*");
shareIntent.putExtra(
android.content.Intent.EXTRA_SUBJECT, title);
shareIntent.putExtra(
android.content.Intent.EXTRA_TITLE, title);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
context.startActivity(Intent.createChooser(shareIntent,
getString(R.string.str_share_this_video)));
}
});
}
答案 2 :(得分:1)
除了Johan vdH的回答,Uri还在
中使用shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
必须是从
获得的那个public void onScanCompleted(String path, Uri uri)
通过
获取UriUri uri = Uri.fromFile(new File(video_path));
不行。 Youtube似乎喜欢content://但不是file://
答案 3 :(得分:1)
在youtube上共享视频的最佳简便方法,使用Provider在Api> = 24的设备中获取Video Uri
private void VideoShareOnYoutube(String videoPath) {
try {
String csYoutubePackage = "com.google.android.youtube";
Intent intent = getPackageManager().getLaunchIntentForPackage(csYoutubePackage);
if (intent != null && !videoPath.isEmpty()) {
Intent share = new Intent(Intent.ACTION_SEND);
share.setPackage(csYoutubePackage);
Uri contentUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
contentUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".my.package.name.provider", new File(videoPath));
}
else
{
contentUri = Uri.fromFile(new File(videoPath));
}
share.setType("video/*");
share.putExtra(Intent.EXTRA_STREAM, contentUri);
startActivity(share);
} else {
Common.showToast("Youtube app not installed!", activty);
}
} catch (Exception e) {
Log.e(TAG, "Youtubeexeption() :" + e.getMessage());
}
}
答案 4 :(得分:0)
使用此代码,您可以尝试。
public void makeVideo(String nameVideo){
String type = "video/*";
// /storage/emulated/0/nameVideo.mp4
// if you have other path is necessary you change the path
String mediaPath = Environment.getExternalStorageDirectory() + File.separator + nameVideo;
createIntent(type, mediaPath);
}
private void createIntent(String type,String mediaPath){
// Create the new Intent using the 'Send' action.
Intent share = new Intent(Intent.ACTION_SEND);
// Set the MIME type
share.setType(type);
// Create the URI from the media
File media = new File(mediaPath);
Uri uri = Uri.fromFile(media);
// Add the URI to the Intent.
share.putExtra(Intent.EXTRA_STREAM, uri);
// Broadcast the Intent.
startActivity(Intent.createChooser(share, "Share to"));
}
更多信息https://instagram.com/developer/mobile-sharing/android-intents/
答案 5 :(得分:0)
只是一个抬头,因为当我试图通过Intent Chooser与Facebook分享视频时,这让我感到高兴,因为Gmail和其他一些意图很好用 - 例如,如果有空格或其他字符被编码为%20空间,则如果您尝试播放该视频,Facebook将无法找到该视频。
我正在使用视频 - 2016年4月27日 - 16:59 pm.mp4 ,并且空格和冒号被替换,打破了Facebook内部的链接。在Facebook上撰写共享时,视频的缩略图会显示,所以我认为没关系,但如果你点击播放它,就会说无法找到/播放该文件。
Gmail没有这样的问题,一旦从电子邮件中检索到,就会发送并播放。
答案 6 :(得分:0)
这是共享视频的有效解决方案,(代码在kotlin中)
startActivity(
Intent.createChooser(
Intent().setAction(Intent.ACTION_SEND)
.setType("video/*")
.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.putExtra(
Intent.EXTRA_STREAM,
getVideoContentUri(this, File(currentVideo.videoPath))
), resources.getString(R.string.share_video)
)
)
别忘了添加以下方法,
/**
* Return the URI for a file. This URI is used for
* sharing of video.
* NOTE: You cannot share a file by file path.
*
* @param context Context
* @param videoFile File
* @return Uri?
*/
fun getVideoContentUri(context: Context, videoFile: File): Uri? {
var uri: Uri? = null
val filePath = videoFile.absolutePath
val cursor = context.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Video.Media._ID),
MediaStore.Video.Media.DATA + "=? ",
arrayOf(filePath), null)
if (cursor != null && cursor.moveToFirst()) {
val id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID))
val baseUri = Uri.parse("content://media/external/video/media")
uri = Uri.withAppendedPath(baseUri, "" + id)
} else if (videoFile.exists()) {
val values = ContentValues()
values.put(MediaStore.Video.Media.DATA, filePath)
uri = context.contentResolver.insert(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values)
}
closeCursor(cursor)
return uri
}
Happy Codng:)