ver photaf panorama online movimiento interactivas imagenes imagen hacer grados fotos esfericas convertir como android camera

photaf - cómo hacer que el usuario haga clic en 5 fotos y mostrarlo en diferentes imágenes en Android



photaf panorama (2)

Estoy haciendo una aplicación de cámara aquí al hacer clic en el botón, abre una cámara pero quiero que pueda hacer clic 5 veces y guardarlo en 5 vistas de imágenes diferentes y también al hacer clic en el botón de la galería, debería abrir una galería y dejar selecciono solo 5 fotos / imágenes y lo guardo en la vista de 5 imágenes diferentes.

gracias por ayudar. Aquí está mi código.

mi archivo XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.test.faultexample.MainActivity"> <Button android:id="@+id/camerabutton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/Edit2" android:text="Camera" /> <LinearLayout android:id="@+id/image_linear" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/camerabutton" android:orientation="horizontal" android:weightSum="10"> <ImageView android:id="@+id/imageview1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" /> <ImageView android:id="@+id/imageview2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" /> <ImageView android:id="@+id/imageview3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" /> <ImageView android:id="@+id/imageview4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" /> <ImageView android:id="@+id/imageview5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" /> </LinearLayout> <LinearLayout android:id="@+id/image_textview_linear" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/image_linear" android:orientation="horizontal" android:weightSum="10"> <TextView android:id="@+id/textview_imagename1" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:gravity="center" android:text="" /> <TextView android:id="@+id/textview_imagename2" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:gravity="center" android:text="" /> <TextView android:id="@+id/textview_imagename3" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:gravity="center" android:text="" /> <TextView android:id="@+id/textview_imagename4" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:gravity="center" android:text="" /> <TextView android:id="@+id/textview_imagename5" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" android:gravity="center" android:text="" /> </LinearLayout> <Button android:id="@+id/btn_select_image_frmgallery" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/image_textview_linear" android:text="select Image" /> <Button android:id="@+id/btnupload" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/btn_select_image_frmgallery" android:paddingTop="10dp" android:text="UPLOAD" /> </RelativeLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText Et = (EditText) findViewById(R.id.Edit1); final EditText Et1 = (EditText) findViewById(R.id.Edit2); //Et.getText().toString(); textview_imagename1 = (TextView) findViewById(R.id.textview_imagename1); textview_imagename2 = (TextView) findViewById(R.id.textview_imagename2); textview_imagename3 = (TextView) findViewById(R.id.textview_imagename3); textview_imagename4 = (TextView) findViewById(R.id.textview_imagename4); textview_imagename5 = (TextView) findViewById(R.id.textview_imagename5); imageView1 = (ImageView) findViewById(R.id.imageview1); imageView2 = (ImageView) findViewById(R.id.imageview2); imageView3 = (ImageView) findViewById(R.id.imageview3); imageView4 = (ImageView) findViewById(R.id.imageview4); imageView5 = (ImageView) findViewById(R.id.imageview5); //Button Upload Binding buttonUploaad = (Button) findViewById(R.id.btnupload); buttonUploaad.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { photo1 = ((BitmapDrawable) imageView1.getDrawable()).getBitmap(); photo2 = ((BitmapDrawable) imageView2.getDrawable()).getBitmap(); photo3 = ((BitmapDrawable) imageView3.getDrawable()).getBitmap(); photo4 = ((BitmapDrawable) imageView4.getDrawable()).getBitmap(); photo5 = ((BitmapDrawable) imageView5.getDrawable()).getBitmap(); //Toast.makeText(getApplicationContext(),"Uploaded Succesfully",Toast.LENGTH_LONG).show(); new UploadImage().execute(); } }); camerabutton = (Button) findViewById(R.id.camerabutton); camerabutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); } }); btnselect = (Button) findViewById(R.id.btn_select_image_frmgallery); btnselect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_PICTURE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PICK_PICTURE: if(requestCode== PICK_PICTURE) { if(resultCode==RESULT_OK){ //data.getParcelableArrayExtra(name); //If Single image selected then it will fetch from Gallery if(data.getData()!=null){ Uri mImageUri=data.getData(); }else{ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { if(data.getClipData()!=null){ ClipData mClipData=data.getClipData(); ArrayList<Uri> mArrayUri=new ArrayList<Uri>(); for(int i=0;i<mClipData.getItemCount();i++){ ClipData.Item item = mClipData.getItemAt(i); Uri uri = item.getUri(); mArrayUri.add(uri); } Log.v("LOG_TAG", "Selected Images"+ mArrayUri.size()); } } } } } super.onActivityResult(requestCode, resultCode, data); case CAMERA_REQUEST: TextView textView = (TextView) findViewById(R.id.textview_imagename1); textView.getText(); if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { photo1 = (Bitmap) data.getExtras().get("data"); imageView1.setImageBitmap(photo1); SaveImage(photo1); } } } private void SaveImage(Bitmap finalBitmap) { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/saved_images"); myDir.mkdirs(); String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); fname = "Image-" + timeStamp + ".jpg"; File file = new File(myDir, fname); if (file.exists()) file.delete(); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); textview_imagename1.setText(fname); } catch (Exception e) { e.printStackTrace(); } } private class UploadImage extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { dialog = ProgressDialog.show(MainActivity.this, "Please Wait !!!", "Please wait", true); } @Override protected String doInBackground(Void... params) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); // Must compress the Image to reduce image size to make upload easy photo1.compress(Bitmap.CompressFormat.PNG, 50, stream); byte[] byte_arr = stream.toByteArray(); String encodedImage = Base64.encodeToString(byte_arr, Base64.DEFAULT); return encodedImage; } @Override protected void onPostExecute(String encodedString) { if (dialog.isShowing()) { dialog.dismiss(); Toast.makeText(getApplicationContext(), encodedString, Toast.LENGTH_LONG).show(); } } } }


Primero necesita tener controles en su cámara. Actualmente está abierto con el modo predeterminado. Entonces, primero abra su cámara en SurfaceView e implemente su propio botón de clic. y manejarlo de acuerdo a su requerimiento.

aquí hay una ref. para cámara personalizada:

Aplicación de cámara personalizada

Y para mostrar imágenes puede pasar uri de imagen una por una, y cuando su cuenta esté completa, muestre la imagen donde desee.

y para la galería necesita establecer 5 uri y mostrarlo.


Según mi experiencia, no existe una solución fácil para su problema. Usando e intención de acceder a una aplicación de cámara, tiene dos opciones relacionadas con su problema:

  1. Solicitud, a través de la intención, para permitir que el usuario tome solo una foto. En este caso, puede proporcionar el URI del archivo donde se almacenará la imagen. Para tomar varias fotos utilizando este método, la aplicación tendrá que iniciar el intento varias veces. Cada vez que el usuario toma una foto, la aplicación de la cámara saldrá y devolverá al usuario a su aplicación. Probablemente esta no es la experiencia que desea.

  2. Solicitar, a través de la intención, invocar la cámara indefinidamente. En este modo, el usuario puede tomar múltiples fotos sin salir de la cámara. Sin embargo, su aplicación no puede especificar dónde van las imágenes. En cambio, irán a donde la aplicación de la cámara decida almacenarlos. A continuación, puede encontrar esos archivos de imágenes y usarlos en su aplicación. Proporcionaré un boceto de cómo implementar esto, a continuación.

Podrías decir que hay una tercera opción, como respondió Neo, y escribir tu propia aplicación de cámara. ¡Sin duda sería mucho trabajo si quieres varios controles, como brillo, zoom, etc.!

Fondo:

En primer lugar, debe conocer la MediaStore. Este es un proveedor de Android que realiza un seguimiento de todas las fotos (y muchos otros archivos multimedia y transmisiones) disponibles en su dispositivo. Cada vez que la aplicación de la cámara toma una imagen, agrega una referencia a MediaStore. Por lo tanto, para la opción 2 anterior, cuando el usuario toma varias fotos usando la aplicación de la cámara, cada imagen se grabará en MediaStore. Esto parece suceder de inmediato, aunque no conozco ninguna documentación que lo respalde. (Por lo tanto, podría haber una aplicación de cámara que posterga la actualización de MediaStore hasta cierto período de tiempo después de que se toma una foto. Probablemente no).

Entre otras cosas, MediaStore registra el

Método

Primero, tenga en cuenta la hora actual. Lo necesitarás, como verás a continuación.

long invokeTime = System.currentTimeMillis ();

Registre un observador para los cambios en MediaStore. Cree una subclase de ContentObserver y use este código para registrarlo en MediaStore.

Uri IMAGES_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; getContentResolver().registerContentObserver (IMAGES_URI, true, this);

Su subclase de observadores necesitará anular los métodos onChange ():

@Override public void onChange (boolean selfChage) { onChange (selfChage, null); } @Override public void onChange (boolean selfChange, Uri uri) { listener.onContentChange (selfChange, uri); }

Y, como puede ver más arriba, necesitará un oyente, o algún tipo de devolución de llamada a su aplicación, para hacer algo cuando ocurra un cambio en (on).

En mi oyente, guardo los URI para las nuevas imágenes en mi ArrayList. Esta es la parte difícil. onChange () se invocará cada vez que se tome una fotografía. También se solicitará cualquier otro cambio en MediaStore, de modo que preste atención solo cuando se guarde una nueva imagen. Consulta la ruta de tiempo y archivo para la imagen más reciente:

String[] projection = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED }; String selection = null; String[] selectionArgs = null; order = MediaStore.Images.ImageColumns.DATE_ADDED + " DESC limit 1"; Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, order);

Y busca la primera fila

if (cursor.moveToNext()) { int dateColumn = cursor.getColumnIndex (MediaStore.Images.Media.DATE_ADDED); int pathColumn = cursor.getColumnIndex (MediaStore.Images.Media.DATA); dateAddedMillis = cursor.getLong (dateColumn) * 1000; path = new File (cursor.getString (pathColumn)); } cursor.close();

Si la última imagen, como se ve arriba:

  • tiene "dateAddedMillis"> invokeTime, y
  • no está ya en capturedImageArray, y
  • su archivo existe (podría ser una notificación para un archivo eliminado)

luego colóquelo en su ImageView, o lo que sea que desee hacer con él.

create bitmap from image stored at "path";

Finalmente, una vez que todo esto esté preparado, invoque la cámara:

static private int ACTIVITY_REQUEST_CAMERA = 2; ... Intent intent = new Intent(); intent.setAction (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);); startActivityForResult (intent, ACTIVITY_REQUEST_CAMERA);

Cuando el usuario sale de la cámara, asegúrese de anular el registro de su observador. De lo contrario, continuará detectando cambios en MediaStore desde cualquier otra aplicación que el usuario use.

El método anterior pretende explicar el núcleo de este proceso. Además, deberá obtener el permiso READ_EXTERNAL_STORAGE. Además, si el usuario tiene una tarjeta SD, es posible que deba asegurarse de que esté montada. Probablemente haya otras consideraciones.

Tampoco es a prueba de fallas. Funciona muy bien, pero el usuario puede invocar otras aplicaciones que crean imágenes y usted las "capturará" también. Probablemente puedas imaginarte otros casos de falla, también.