Android技巧: 如何读取 apk 中的 Video

本文介绍了两种在Android应用中读取apk内部video文件的方法:一是通过拆解文件从assets目录读取,二是利用URI直接读取raw目录下的视频。这两种方式能方便地在不分离apk的情况下播放内置视频。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把 video 放在  apk 包中, 可以方便程序的安装,有两种读取的方法

从包中拆解文件再读取

video 文件放在 Prj_Dir/assets 下 ( Prj_Dir/assets/myvideo.mp4)

			
public class VideoActivity extends Activity {

    public final String TAG = "VideoActivity";
    private final String VIDEO = "myvideo.mp4";

    public boolean storeVideoFile() {
        try {
            InputStream is = getResources().getAssets().open(VIDEO);
			
            //注意,这里用 MODE_WORLD_READABLE 是因为播放Video的是MediaPlayer进程,不是本进程
            //为了让, MediaPlayer进程能读取此文件,所以设置为: MODE_WORLD_READABLE
            FileOutputStream os = openFileOutput(VIDEO, MODE_WORLD_READABLE);
			
            byte[] buffer = new byte[1024];
            while (is.read(buffer) > -1) {
                os.write(buffer);
            }
            is.close();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!storeVideoFile())
            return;

        VideoView videoView = new VideoView(this);
        setContentView(videoView);
        // videoView.setMediaController(new MediaController(this));
        videoView.setVideoPath(getFilesDir().getAbsolutePath() + "/" + VIDEO);

        videoView.setOnPreparedListener(new OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setLooping(true);
            }
        });

        videoView.start();
    }

}			

使用URI

这种方法,更加简洁, Video 文件放 Prj_dir/raw/ 下面

public class VideoActivity extends Activity {

    public final String TAG = "VideoActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Uri uri = Uri.parse("android.resource://" + getPackageName() + "/"
                + R.raw.myvideo);
        VideoView videoView = new VideoView(this);
        setContentView(videoView);
        videoView.setVideoURI(uri);
        Log.e(TAG, " uri is:" + uri);

        videoView.setOnPreparedListener(new OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setLooping(true);
            }
        });

        videoView.start();
    }

}



在 Code::Blocks 中,C 语言程序输出乱码的原因可能有以下几种情况: 1. 使用了错误的字符编码:确保程序文件使用的字符编码与你的操作系统和终端的字符编码一致。一般情况下,UTF-8 是一个通用的编码格式,可以尝试在程序中使用该编码。 2. 使用了错误的输出函数:在 C 语言中,输出函数有多种,如 printf、puts、fputs 等,每个函数的使用方式和输出结果略有不同,需要根据具体的需求进行选择。 3. 终端字符编码设置错误:如果程序输出到终端,那么终端的字符编码也需要正确设置。在 Windows 系统下,可以使用 chcp 命令来设置终端的字符编码;在 Linux 和 macOS 系统下,可以使用 locale 命令来设置终端的字符编码。 4. 程序中存在中文字符:如果程序中存在中文字符,需要在程序中添加 #pragma execution_character_set("utf-8") 或者 #pragma execution_character_set("gbk") 等语句来设置字符编码。 如果以上方法都不起作用,可以尝试在程序中使用 Unicode 编码,并将输出转换成 UTF-8 或者 GBK 编码。可以使用如下代码来进行转换: ```c #include <locale.h> #include <wchar.h> #include <stdlib.h> void unicode_to_utf8(wchar_t *in, char *out, size_t len) { setlocale(LC_ALL, "en_US.utf8"); wcstombs(out, in, len); } void unicode_to_gbk(wchar_t *in, char *out, size_t len) { setlocale(LC_ALL, "zh_CN.gbk"); wcstombs(out, in, len); } ``` 使用上述代码,可以将 Unicode 编码的字符串转换成 UTF-8 或者 GBK 编码,然后再进行输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值