我正在开发 android 相机应用程序,我必须在其中捕获自拍图像/视频并发送到服务器。我用意图打开相机。我已经在下面实现了代码,但是对于那些具有外部存储的设备,此代码可以正常工作,但对于那些没有外部存储的设备,应用程序已经在这行代码 Environment.getExternalStorageState() 上工作了。请给我建议如何完成我的场景?
private static final int PICK_FILE_REQUEST = 1;
private static final String TAG = MainActivity.class.getSimpleName();
private String selectedFilePath;
ImageView bimage, bvideo;
ArrayList imageList;
TextView bimage_gallery, bvideo_gallery;
//ProgressDialog dialog;
PowerManager.WakeLock wakeLock;
String flag_value, thumbnail, email;
private static final String EXTRA_FILENAME = "com.commonsware.android.camcon.EXTRA_FILENAME";
private static final String FILENAME = "CameraContentDemo.jpeg";
private static final int CONTENT_REQUEST = 1337;
private File output = null;
private Uri outputUri = null;
public static final int MEDIA_TYPE_IMAGE = 1;
Uri fileUri;
int dialog_nbr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isFrstAttemp();
occupyFullScreen();
setContentView(R.layout.home_screen);
getRefereces();
}
// is this first attemp of user, please first register yourself
public void isFrstAttemp() {
SharedPreferences mSharedPreferences = getSharedPreferences("filter", MODE_PRIVATE);
email = mSharedPreferences.getString("isRegistered", "no");
if (email.equals("no")) {
Intent intent = new Intent(MainActivity.this, SignUp.class);
startActivity(intent);
finish();
}
}
//set full screen
public void occupyFullScreen() {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
//get references
public void getRefereces() {
bimage = (ImageView) findViewById(R.id.camera);
bvideo = (ImageView) findViewById(R.id.videos);
bimage_gallery = (TextView) findViewById(R.id.img_gallery);
bvideo_gallery = (TextView) findViewById(R.id.videos_gallery);
bimage.setOnClickListener(this);
bimage_gallery.setOnClickListener(this);
bvideo_gallery.setOnClickListener(this);
bvideo.setOnClickListener(this);
imageList = new ArrayList<>();
}
// Create a file Uri for saving an image or video
private Uri getOutputMediaFileUri(int type) {
if (getOutputMediaFile(type)==null){
dialog_nbr=6;
storageProblem();
return null;
}
else{
Uri path= Uri.fromFile(getOutputMediaFile(type));
return path;
}
}
private File getOutputMediaFile(int type) {
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_" + timeStamp + ".jpg");
} else {
return null;
}
return mediaFile;
}
else {
return null;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.camera:
imageCapture();
break;
case R.id.videos:
videocapture();
break;
case R.id.img_gallery:
if (haveNetworkConnection()) {
Intent intent = new Intent(MainActivity.this, Gallery_images.class);
startActivity(intent);
} else {
dialog_nbr=1;
openDialog();
}
break;
case R.id.videos_gallery:
if (haveNetworkConnection()) {
Intent intent2 = new Intent(MainActivity.this, Gallery_videos.class);
startActivity(intent2);
} else {
dialog_nbr=1;
openDialog();
}
break;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(EXTRA_FILENAME, output);
}
public void imageCapture() {
flag_value = "1";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
if (fileUri!=null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, CONTENT_REQUEST);
}
}
private void videocapture() {
flag_value = "2";
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
startActivityForResult(intent, PICK_FILE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (haveNetworkConnection()) {
if (requestCode == PICK_FILE_REQUEST) {
if (data == null) {
return;
}
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG);
wakeLock.acquire();
Uri selectedFileUri = data.getData();
selectedFilePath = FilePath.getPath(this, selectedFileUri);
if (flag_value == "2") {
Bitmap thumb = ThumbnailUtils.createVideoThumbnail(selectedFilePath,
MediaStore.Images.Thumbnails.MICRO_KIND);
flag_value = getStringImage(thumb);
}
Log.i(TAG, "Selected File Path:" + selectedFilePath);
if (selectedFilePath != null) {
new Thread(new Runnable() {
@Override
public void run() {
try {
uploadFile(selectedFilePath);
} catch (OutOfMemoryError e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Insufficient Memory!", Toast.LENGTH_SHORT).show();
}
});
// dialog.dismiss();
}
}
}).start();
} else {
Toast.makeText(MainActivity.this, "Please choose a File First", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == CONTENT_REQUEST) {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG);
wakeLock.acquire();
new Thread(new Runnable() {
@Override
public void run() {
try {
//creating new thread to handle Http Operations
uploadFile(fileUri.getPath());
} catch (OutOfMemoryError e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog_nbr=2;
openDialog();
}
});
}
}
}).start();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "Cancelled", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Sorry! Failed to capture image", Toast.LENGTH_SHORT).show();
}
}
else {
dialog_nbr=1;
openDialog();
}
}
}
public int uploadFile(final String selectedFilePath) {
int serverResponseCode = 0;
HttpURLConnection connection;
DataOutputStream dataOutputStream;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File selectedFile = new File(selectedFilePath);
String[] parts = selectedFilePath.split("/");
if (!selectedFile.isFile()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "suurce file does not exist", Toast.LENGTH_SHORT).show();
}
});
return 0;
} else {
try {
FileInputStream fileInputStream = new FileInputStream(selectedFile);
URL url = new URL(Constant.SERVER_URL);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);//Allow Inputs
connection.setDoOutput(true);//Allow Outputs
connection.setUseCaches(false);//Don't use a cached Copy
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("ENCTYPE", "multipart/form-data");
connection.setRequestProperty(
"Content-Type", "multipart/form-data;boundary=" + boundary);
connection.setRequestProperty("uploaded_file", selectedFilePath);
dataOutputStream = new DataOutputStream(connection.getOutputStream());
dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + selectedFilePath + "\"" + lineEnd);
dataOutputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
//selecting the buffer size as minimum of available bytes or 1 MB
bufferSize = Math.min(bytesAvailable, maxBufferSize);
//setting the buffer as byte array of size of bufferSize
buffer = new byte[bufferSize];
//reads bytes from FileInputStream(from 0th index of buffer to buffersize)
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
try {
dataOutputStream.write(buffer, 0, bufferSize);
} catch (OutOfMemoryError e) {
dialog_nbr=2;
openDialog();
}
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
dataOutputStream.writeBytes(lineEnd);
dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"email\"" + lineEnd);
dataOutputStream.writeBytes(lineEnd);
dataOutputStream.writeBytes(email);
dataOutputStream.writeBytes(lineEnd);
dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"flag\"" + lineEnd);
dataOutputStream.writeBytes(lineEnd);
dataOutputStream.writeBytes(flag_value);
dataOutputStream.writeBytes(lineEnd);
// get server ok responce
try {
serverResponseCode = connection.getResponseCode();
} catch (OutOfMemoryError e) {
dialog_nbr=2;
openDialog();
}
//response code of 200 indicates the server status OK
if (serverResponseCode == 200) {
// imageList.add(selectedFilePath);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
//reading server echo responce
InputStream is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog_nbr=4;
openDialog();
}
});
//closing the input and output streams
fileInputStream.close();
dataOutputStream.flush();
dataOutputStream.close();
if (wakeLock.isHeld()) {
wakeLock.release();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "File Not Found", Toast.LENGTH_SHORT).show();
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "URL Error!", Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
return serverResponseCode;
}
}
public String getStringImage(Bitmap bmp) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
}
private boolean haveNetworkConnection() {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}
public void openDialog() {
View dialogView=null;
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
if (dialog_nbr==1)
dialogView = inflater.inflate(R.layout.dialog_connection, null);
else if (dialog_nbr==2){
dialogView = inflater.inflate(R.layout.dialog_insufficeint_memory, null);
}
else if (dialog_nbr==3){
dialogView = inflater.inflate(R.layout.dialog_server_error, null);
}
else if (dialog_nbr==4){
dialogView = inflater.inflate(R.layout.dialog_file_uploaded, null);
}
else if (dialog_nbr==5){
dialogView = inflater.inflate(R.layout.dialog_exit, null);
}
dialogBuilder.setView(dialogView);
final AlertDialog findMeDialog = dialogBuilder.create();
findMeDialog.show();
LinearLayout reset_btn = (LinearLayout) dialogView.findViewById(R.id.ok);
reset_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findMeDialog.dismiss();
}
});
}
public void storageProblem(){
View dialogView=null;
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
dialogView = inflater.inflate(R.layout.dialog_external_storage_error, null);
dialogBuilder.setView(dialogView);
final AlertDialog findMeDialog = dialogBuilder.create();
findMeDialog.show();
LinearLayout reset_btn = (LinearLayout) dialogView.findViewById(R.id.ok);
reset_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findMeDialog.dismiss();
System.exit(0);
}
});
}
@Override
public void onBackPressed() {
dialog_nbr=3;
View dialogView=null;
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
dialogView = inflater.inflate(R.layout.dialog_exit, null);
dialogBuilder.setView(dialogView);
final AlertDialog findMeDialog = dialogBuilder.create();
findMeDialog.show();
TextView cancel_btn = (TextView) dialogView.findViewById(R.id.cancel);
TextView exit_btn = (TextView) dialogView.findViewById(R.id.exit);
cancel_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findMeDialog.dismiss();
}
});
exit_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findMeDialog.dismiss();
finish();
}
});
}
}
这段代码在我的设备上运行良好,但是当我的客户在华为 p9 lite 上进行测试时,应用程序崩溃了, Environment.getExternalStorageState()
因为它说你没有安装 sd 卡。请给我一个解决方案,该代码如何适用于那些没有外部存储的设备