java.lang.RuntimeException:无法实例化活动ComponentInfo java构建路径

时间:2014-01-02 15:18:08

标签: java android eclipse

我正在使用开发者Android网站的Samples部分上显示的Android项目(特别是MediaRecorder sample

我下载了该文件并将其导入Eclipse中 导入过程似乎正确实现,我在日食模拟器上启动了应用程序 我收到此消息“不幸的是,MediaRecorder已停止”

这些是catlog中的错误:

01-01 07:22:33.336: I/Process(1423): Sending signal. PID: 1423 SIG: 9
01-02 04:34:23.366: D/AndroidRuntime(1558): Shutting down VM
01-02 04:34:23.376: W/dalvikvm(1558): threadid=1: thread exiting with uncaught            exception (group=0xb1aadb90)
01-02 04:34:23.506: E/AndroidRuntime(1558): FATAL EXCEPTION: main
01-02 04:34:23.506: E/AndroidRuntime(1558): Process: com.example.android.mediarecorder, PID: 1558
01-02 04:34:23.506: E/AndroidRuntime(1558): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.android.mediarecorder/com.example.android.mediarecorder.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.android.mediarecorder.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.android.mediarecorder-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.android.mediarecorder-1, /system/lib]]
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2102)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.os.Looper.loop(Looper.java:137)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.ActivityThread.main(ActivityThread.java:4998)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at java.lang.reflect.Method.invoke(Method.java:515)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at dalvik.system.NativeStart.main(Native Method)
01-02 04:34:23.506: E/AndroidRuntime(1558): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.android.mediarecorder.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.android.mediarecorder-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.android.mediarecorder-1, /system/lib]]
01-02 04:34:23.506: E/AndroidRuntime(1558):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
01-02 04:34:23.506: E/AndroidRuntime(1558):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2093)
01-02 04:34:23.506: E/AndroidRuntime(1558):     ... 11 more
01-02 04:34:32.246: I/Process(1558): Sending signal. PID: 1558 SIG: 9

我的清单是:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.android.mediarecorder"
 android:versionCode="1"
 android:versionName="1.0">

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<!-- This app records A/V content from camera and stores it to disk -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <!-- Since this sample records video from camera preview, locking the orientation to
        landscape. Landscape mode offers us more preview space with standard video aspect
        ratios (width > height) -->
    <activity
        android:name=".MainActivity"


        android:label="@string/app_name"
        android:screenOrientation="landscape">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

我在之前的帖子中读到问题可能取决于Java Build Path的正确配置,但由于我是android和编程的新手,我无法弄清楚如何修改java版本以使应用程序正常工作。

我还附上了Java构建路径

的图像

java build path libraries

java build path order and export

任何人都可以给我一些提示吗?提前致谢

我在下面添加了MainActivity代码

/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.mediarecorder;

import android.annotation.TargetApi;
import android.app.Activity;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;

import com.example.android.common.media.CameraHelper;

import java.io.IOException;
import java.util.List;

/**
 *  This activity uses the camera/camcorder as the A/V source for the {@link android.media.MediaRecorder} API.
 *  A {@link android.view.TextureView} is used as the camera preview which limits the code to API 14+. This
 *  can be easily replaced with a {@link android.view.SurfaceView} to run on older devices.
 */
public class MainActivity extends Activity {

    private Camera mCamera;
    private TextureView mPreview;
    private MediaRecorder mMediaRecorder;

    private boolean isRecording = false;
    private static final String TAG = "Recorder";
    private Button captureButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_main);

        mPreview = (TextureView) findViewById(R.id.surface_view);
        captureButton = (Button) findViewById(R.id.button_capture);
    }

    /**
     * The capture button controls all user interaction. When recording, the button click
     * stops recording, releases {@link android.media.MediaRecorder} and {@link android.hardware.Camera}. When not recording,
     * it prepares the {@link android.media.MediaRecorder} and starts recording.
     *
     * @param view the view generating the event.
     */
    public void onCaptureClick(View view) {
    if (isRecording) {
            // BEGIN_INCLUDE(stop_release_media_recorder)

            // stop recording and release camera
            mMediaRecorder.stop();  // stop the recording
            releaseMediaRecorder(); // release the MediaRecorder object
            mCamera.lock();         // take camera access back from MediaRecorder

            // inform the user that recording has stopped
            setCaptureButtonText("Capture");
            isRecording = false;
            releaseCamera();
            // END_INCLUDE(stop_release_media_recorder)

        } else {

            // BEGIN_INCLUDE(prepare_start_media_recorder)

            new MediaPrepareTask().execute(null, null, null);

            // END_INCLUDE(prepare_start_media_recorder)

        }
    }

    private void setCaptureButtonText(String title) {
        captureButton.setText(title);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // if we are using MediaRecorder, release it first
        releaseMediaRecorder();
        // release the camera immediately on pause event
        releaseCamera();
    }

    private void releaseMediaRecorder(){
        if (mMediaRecorder != null) {
            // clear recorder configuration
            mMediaRecorder.reset();
            // release the recorder object
            mMediaRecorder.release();
            mMediaRecorder = null;
            // Lock camera for later use i.e taking it back from MediaRecorder.
            // MediaRecorder doesn't need it anymore and we will release it if the activity pauses.
            mCamera.lock();
        }
    }

    private void releaseCamera(){
        if (mCamera != null){
            // release the camera for other applications
            mCamera.release();
            mCamera = null;
        }
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private boolean prepareVideoRecorder(){

        // BEGIN_INCLUDE (configure_preview)
        mCamera = CameraHelper.getDefaultCameraInstance();

        // We need to make sure that our preview and recording video size are supported by the
        // camera. Query camera to find all the sizes and choose the optimal size given the
        // dimensions of our preview surface.
        Camera.Parameters parameters = mCamera.getParameters();
        List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
        Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(mSupportedPreviewSizes,              mPreview.getWidth(), mPreview.getHeight());

        // Use the same size for recording profile.
        CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
        profile.videoFrameWidth = optimalSize.width;
        profile.videoFrameHeight = optimalSize.height;

        // likewise for the camera object itself.
        parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight);
        mCamera.setParameters(parameters);
        try {
                // Requires API level 11+, For backward compatibility use {@link setPreviewDisplay}
                // with {@link SurfaceView}
                mCamera.setPreviewTexture(mPreview.getSurfaceTexture());
        } catch (IOException e) {
            Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage());
            return false;
        }
        // END_INCLUDE (configure_preview)


        // BEGIN_INCLUDE (configure_media_recorder)
        mMediaRecorder = new MediaRecorder();

        // Step 1: Unlock and set camera to MediaRecorder
        mCamera.unlock();
        mMediaRecorder.setCamera(mCamera);

        // Step 2: Set sources
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT );
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
        mMediaRecorder.setProfile(profile);

        // Step 4: Set output file
        mMediaRecorder.setOutputFile(CameraHelper.getOutputMediaFile(
            CameraHelper.MEDIA_TYPE_VIDEO).toString());
        // END_INCLUDE (configure_media_recorder)

        // Step 5: Prepare configured MediaRecorder
        try {
            mMediaRecorder.prepare();
        } catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
            releaseMediaRecorder();
            return false;
        }
        return true;
    }

    /**
     * Asynchronous task for preparing the {@link android.media.MediaRecorder} since it's a long blocking
     * operation.
     */
    class MediaPrepareTask extends AsyncTask<Void, Void, Boolean> {

        @Override
        protected Boolean doInBackground(Void... voids) {
            // initialize video camera
            if (prepareVideoRecorder()) {
                // Camera is available and unlocked, MediaRecorder is prepared,
                // now you can start recording
                mMediaRecorder.start();

                isRecording = true;
            } else {
                // prepare didn't work, release the camera
                releaseMediaRecorder();
                return false;
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (!result) {
               MainActivity.this.finish();
            }
            // inform the user that recording has started
            setCaptureButtonText("Stop");

        }
    }

}

2 个答案:

答案 0 :(得分:2)

尝试此操作,将Activity名称更改为完整的班级名称:

<activity
    android:name="com.example.android.mediaRecorder.MainActivity"

答案 1 :(得分:0)

我认为将类包名称或清单包名称设置为IDE时会更改它们。 错误显示与清单文件中使用的类名称不匹配。