Android呼叫系統相機拍照,從相簿中選擇照片,呼叫系統攝像機錄影
阿新 • • 發佈:2019-02-08
最近在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"/>