分享意图不适用于将视频上传到youtube

时间:2013-09-04 00:23:39

标签: android facebook video android-intent youtube

我正在尝试共享正在创建并存储在已获取其路径的外部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;。

7 个答案:

答案 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)

通过

获取Uri
Uri  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:)