#android #image #camera
#Android #изображение #камера
Вопрос:
Я разработал простое приложение для камеры для Android. Теперь я хочу изменить это приложение, чтобы уменьшить размер снимаемого изображения с помощью камеры и сохранить изображение во внешнее хранилище. При этом я добавляю свой MainActivity.java
скрипт. Как я могу изменить этот код, чтобы уменьшить размер изображения и сохранить во внешнее хранилище?
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_CODE = 100;
private static final int IMAGE_CAPTURE_CODE = 101;
Button btnCapture;
ImageView imageCapture;
Uri image_uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnCapture=findViewById(R.id.btnCapture);
imageCapture=findViewById(R.id.imgView);
btnCapture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if(checkSelfPermission (Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED
|| checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
String[] permission={CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permission, PERMISSION_CODE);
}
else {
openCamera();
}
}
else {
openCamera();
}
}
});
}
private void openCamera() {
ContentValues values=new ContentValues();
image_uri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
camIntent.putExtra(MediaStore.EXTRA_OUTPUT,image_uri);
startActivityForResult(camIntent, IMAGE_CAPTURE_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case PERMISSION_CODE:{
if(grantResults.length>0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED){
openCamera();
}
else {
Toast.makeText(this,"Permission Denied",Toast.LENGTH_SHORT).show();
}
}
}
}
}
Комментарии:
1. Вы используете не javascript, а java. Ваш пост сбивает с толку.
2. тьфу. JavaScript так много лет назад назывался специально, чтобы люди путали его с java, который уже был очень успешным языком в то время, когда JS выходил. Тем не менее, удивительно видеть, что 24 года спустя люди все еще путают их.
Ответ №1:
сначала добавьте разрешение в свой манифест, затем вы можете записывать на SD-карту :
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
и поэтому вам нужно получить свое растровое изображение. вы можете попытаться получить его из вашего ImageView
imageCapture
, например:
BitmapDrawable drawable = (BitmapDrawable) mImageView1.getDrawable();
Bitmap bitmap = drawable.getBitmap();
вам нужно попасть в каталог с SD-карты
File sdCardDir = Environment.getExternalStorageDirectory();
// Next, create your specific file for image storage:
File image = new File(sdCardDir , "myTest.png");
//After that, you just have to write the Bitmap :
boolean success = false;
// Encode the file as a PNG image.
FileOutputStream outStream;
try {
outStream = new FileOutputStream(image);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
// 100 to keep full quality of the image
// You can reduce the size of the image if you decrease the value
outStream.flush();
outStream.close();
success = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(getApplicationContext(), "Image saved with success",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during image saving", Toast.LENGTH_LONG).show();
}
Ответ №2:
Вы не можете изменить поведение используемого намерения камеры и используемого приложения камеры.
Всегда полное изображение будет сохранено в предоставленном вами uri.
Если вы хотите изменить файл, вы можете сделать это только после этого.