1. 程式人生 > >Android呼叫系統相機拍照,從相簿中選擇照片,呼叫系統攝像機錄影

Android呼叫系統相機拍照,從相簿中選擇照片,呼叫系統攝像機錄影

最近在Android Studio上折騰程式碼,昨天編譯器又很不給面子的報錯了:

Error type 3
Error: Activity class {com.example.myapplication/com.example.myapplication
.MainActivity} does not exist.

程式都安裝不起來,並不是忘了註冊類名,在stackoverflow按照大神們的解決方法試了,沒有效果。接下來所有新建的工程都報這個錯誤,搞得我都懷疑喵生了。。。都準備重灌新版本了,1.5版本已出。
今天過來一看,好了,得出結論,重啟是萬能的:重啟了電腦和手機。
先上佈局:
這裡用了一個ImageView,拍照和相簿都用這個顯示。顯示錄影的控制元件使用的是VideoView。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:text="拍照"
        android:onClick
="takePhoto" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<Button android:text="從手機相簿中選擇" android:onClick="choosePhoto" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView
android:id="@+id/iv" android:layout_width="150dp" android:layout_height="200dp" android:layout_gravity="center" android:background="#ff00ff" android:scaleType="fitXY"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="錄製視訊" android:onClick="takeVideo"/> <VideoView android:id="@+id/vv" android:layout_width="300dp" android:layout_height="400dp" android:layout_gravity="center"/> </LinearLayout>
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.VideoView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Context context;
    public static final String TAG="MyLog";
    private static final  int REQUEST_CAMERA_CAPTURE=1;
    private static final  int REQUEST_IMAGE_CAPTURE=2;
    private static final  int REQUEST_VIDEO_CAPTURE=3;
    private File imagePath,videoPath;
    private ImageView mImageView;
    private VideoView mVideoView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context=this;
        mImageView=(ImageView)findViewById(R.id.iv);
        mVideoView=(VideoView)findViewById(R.id.vv);
    }

    public void takePhoto(View view){
        takePhoto();
    }
    public void choosePhoto(View view){
        choosePhoto();
    }
    public void myCamera(View view){myCamera();}
    public void takeVideo(View view){
        takeVideo();
    }

    private void takeVideo(){
        if(hasSdcard()) {
            videoPath = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_MOVIES);
            if (!videoPath.exists()) {
                videoPath.mkdirs();
            }
            videoPath = new File(videoPath.getPath() + "/" + "test.mp4");
//        直接呼叫已經存在的錄影並播放
//        Uri uri=Uri.fromFile(videoPath);
//        Intent intent = new Intent(Intent.ACTION_VIEW);
//        Log.d(TAG,uri+"");
//        intent.setDataAndType(uri, "video/mp4");
//        startActivity(intent);

            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
            if (intent.resolveActivity(getPackageManager()) != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(videoPath));
                startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);
            }
        }
    }

    private void takePhoto(){
        if(hasSdcard()) {
Environment.DIRECTORY_PICTURES);
            if (!imagePath.exists()) {
                imagePath.mkdirs();
            }
            imagePath = new File(imagePath.getPath() + "/" + "temp.png");
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (intent.resolveActivity(getPackageManager()) != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imagePath));
                startActivityForResult(intent, REQUEST_CAMERA_CAPTURE);
            }
        }
    }

    private void choosePhoto(){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==REQUEST_CAMERA_CAPTURE&&resultCode==RESULT_OK){
            FileInputStream fis = null;
            try {
                fis=new FileInputStream(imagePath);
                Bitmap bitmap= BitmapFactory.decodeStream(fis);
                mImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }else if(requestCode==REQUEST_IMAGE_CAPTURE&&resultCode==RESULT_OK){
            Uri uri=data.getData();
            mImageView.setImageURI(uri);
        }else if(requestCode==REQUEST_VIDEO_CAPTURE&&resultCode==RESULT_OK){
            Uri uri=Uri.fromFile(videoPath);
            Log.d(TAG,uri+"");
            mVideoView.setVideoURI(uri);
            mVideoView.setMediaController(new MediaController(this));
            mVideoView.start();
            mVideoView.requestFocus();
            mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.d(TAG, "完成");
                }
            });

            mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {

                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Log.d(TAG, "播放中出現錯誤");
                    return false;
                }
            });
        }
    }

private boolean hasSdcard(){
        if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
            return true;
        }else{
            return false;
        }
    }
}

官方說明:
注意在呼叫startActivityForResult()方法之前,先呼叫resolveActivity(),這個方法會返回能處理該Intent的第一個Activity(譯註:即檢查有沒有能處理這個Intent的Activity)。執行這個檢查非常重要,因為如果在呼叫startActivityForResult()時,沒有應用能處理你的Intent,應用將會崩潰。所以只要返回結果不為null,使用該Intent就是安全的。
最後不要忘了加許可權:

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