草庐IT

android - MediaRecorder - 固件升级后代码停止工作

coder 2023-12-15 原文

我有一个在 android 2.2 上运行的 samsung galaxy 选项卡。我开发了一个简单的程序来分别录制音频和视频。它在我的 galaxy 选项卡上运行良好。但是,在我升级到 android 2.3.3 后,一切都变了。从那一刻起,我的代码就停止工作了。这是我的代码,它显示了这种意外的(对我来说 :))行为:

// import statements

public class CameraPreview extends Activity implements SurfaceHolder.Callback {
    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    boolean previewing = false;
    LayoutInflater controlInflater = null;
    Button recordButton;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        controlInflater = LayoutInflater.from(getBaseContext());
        View viewControl = controlInflater.inflate(R.layout.control, null);
        LayoutParams layoutParamsControl = new LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        this.addContentView(viewControl, layoutParamsControl);

        recordButton = (Button)viewControl.findViewById(R.id.start_recording);
        recordButton.setOnClickListener(new View.OnClickListener() {            
            public void onClick(View v) {
                startRecording();
            }
        });

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if (previewing) {
            camera.stopPreview();
            previewing = false;
        }

        if (camera != null) {
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
                previewing = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }

    private void startRecording() {
        try {
            stopPreview();

            Thread video = new Thread(new Runnable() {
                public void run() {
                    videoRecorder = new MediaRecorder();
                    videoRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
                    videoRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
                    videoRecorder.setOutputFormat(2);
                    videoRecorder.setVideoEncodingBitRate(56 * 8 * 1024);
                    videoRecorder.setVideoSize(176, 144);
                    videoRecorder.setVideoFrameRate(12);
                    videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
                    videoRecorder.setOutputFile("/sdcard/video.m4e");
                    try {
                        videoRecorder.prepare();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    videoRecorder.start();
                }
            });
            video.start();

            Thread audio = new Thread(new Runnable() {              
                public void run() {
                    audioRecorder = new MediaRecorder();
                    audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
                    audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    audioRecorder.setOutputFile("/sdcard/audio.amr");
                    try {
                        audioRecorder.prepare();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    audioRecorder.start();
                }
            });
            audio.start();
        } catch (Exception e) {
            Log.e("streamer", "Unable to start recording", e);
        }
    }

    private void stopPreview() {
        if (camera == null) {
            throw new RuntimeException();           
        }
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

日志输出如下:

     PID     TAG                MESSAGE

D    75      CameraHardwareSec  MemoryHeapBase(fd(27), size(5760128), width(800), height(600))
E    75      AuthorDriver       Command 13 completed with error -17
E    7169    MediaRecorder      prepare failed: -17
W    7169    System.err         java.io.IOException: prepare failed.
W    7169    System.err         at android.media.MediaRecorder._prepare(Native Method)
W    7169    System.err         at android.media.MediaRecorder.prepare(MediaRecorder.java:592)
W    7169    System.err         at com.video.streamer.view.CameraPreview$2.run(CameraPreview.java:121)
W    7169    System.err         at java.lang.Thread.run(Thread.java:1019)
E    7169    MediaRecorder      start called in an invalid state: 0
W    7169    dalvikvm           threadid=10: thread exiting with uncaught exception (group=0x40015578)
E    7169    AndroidRuntime     FATAL EXCEPTION: Thread-11
E    7169    AndroidRuntime     java.lang.IllegalStateException
E    7169    AndroidRuntime     at android.media.MediaRecorder.start(Native Method)
E    7169    AndroidRuntime     at com.video.streamer.view.CameraPreview$2.run(CameraPreview.java:127)
E    7169    AndroidRuntime     at java.lang.Thread.run(Thread.java:1019)
W    118     ActivityManager    Force finishing activity com.video.streamer.view/.CameraPreview

以下是我用于布局目的的 XML 文件。 相机.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<SurfaceView
    android:id="@+id/camerapreview"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    />
</LinearLayout>

控制.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="bottom"
    >
<Button
    android:id="@+id/start_recording"  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text=" * Start Recording" 
    android:layout_gravity="right"
    android:layout_margin="10px"
    />
</LinearLayout>

我在 AndroidManifest.xml 上使用了以下权限

<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

我从 roman10 家伙的博客上得到的一个视频录制示例:Android Video Recording API–Illustrated with an Example也适用于我的 android 2.2。但是,由于我的升级,它也停止工作了。

使用 android 2.3.3 录制视频时,我是否遗漏了什么。我该如何解决这个问题?

最佳答案

Android SDK 不断更改其 API,因此当您对路径进行硬编码时会出现问题:

videoRecorder.setOutputFile("/sdcard/video.m4e");//or
audioRecorder.setOutputFile("/sdcard/audio.amr");

如果 API 更改目录,您的应用程序将被破坏。获取文件路径的更好方法是使用 API 函数:

mVideoFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mVideoFileName += "/video.m4e";

mAudioFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mAudioFileName += "/audio.amr";

关于android - MediaRecorder - 固件升级后代码停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122659/

有关android - MediaRecorder - 固件升级后代码停止工作的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  6. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  7. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  9. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  10. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

随机推荐