Androidカスタムcameraおよびuriとファイルパス間の変換
13000 ワード
システムを直接呼び出すcameraに対して,この方法は比較的少ない.apiドキュメントに従って、手順は次のとおりです.
プレビュークラスを定義
『android高給の道』という本を参照すると、このような方法の完全な実現があります.
対応するactivityは次のとおりです.
同時に相応の権限を加えたことを忘れないでください.ここでファイルパスをuriに変換する方法がありますが、逆にuriでファイルパスを表示するにはどうすればいいですか?
プレビュークラスを定義
『android高給の道』という本を参照すると、このような方法の完全な実現があります.
対応するactivityは次のとおりです.
package com.bobo.mycamara;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
public class MyCameraActivity extends Activity {
private Camera mCamera;
private Button btn_capture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.mycamera_layout);
btn_capture = (Button) this.findViewById(R.id.button_capture);
mCamera = getCameraInstance();
MyCameraPreview mPreview = new MyCameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
btn_capture.setOnClickListener(new CaptureListener());
}
class CaptureListener implements View.OnClickListener {
@Override
public void onClick(View v) {
//
mCamera.takePicture(null, null, mPicture);
}
}
//
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//
System.out.println(new String(data));
File mediaFile = getMediaFile();
try {
FileOutputStream fos = new FileOutputStream(mediaFile);
//
fos.write(data);
// , bitmap , bitmap , matrix
// Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0,
// data.length);
// bitmap.compress(CompressFormat.JPEG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
}
}
};
// activity camera release
@Override
protected void onPause() {
super.onPause();
if (this.mCamera != null) {
this.mCamera.release();
this.mCamera = null;
}
}
protected Uri getFileUri(File file) {
return Uri.fromFile(file);
}
protected File getMediaFile() {
File mediaDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"myCamera");
if (!mediaDir.exists()) {
if (!mediaDir.mkdirs()) {
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
File mediaFile;
mediaFile = new File(mediaDir.getPath() + File.separator + "IMG_"
+ timeStamp + ".jpg");
return mediaFile;
}
//
public Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
} catch (Exception e) {
}
return c;
}
}
private String getRealPath(Uri fileUrl) {
String fileName = null;
Uri filePathUri = fileUrl;
if (fileUrl != null) {
if (fileUrl.getScheme().toString().compareTo("content") == 0) {
// content:// uri
Cursor cursor = getContentResolver().query(fileUrl, null, null,
null, null);
if (cursor != null && cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow("_data");
fileName = cursor.getString(column_index); //
if (!fileName.startsWith("/mnt")) {
// ”/mnt“
fileName = "/mnt" + fileName;
}
cursor.close();
}
} else if (fileUrl.getScheme().compareTo("file") == 0) {
// file:/// uri
fileName = filePathUri.toString();
fileName = filePathUri.toString().replace("file://", "");
// file://
if (!fileName.startsWith("/mnt")) {
// "/mnt"
fileName += "/mnt";
}
}
}
return fileName;
}
同時に相応の権限を加えたことを忘れないでください.ここでファイルパスをuriに変換する方法がありますが、逆にuriでファイルパスを表示するにはどうすればいいですか?