2015-01-10 13 views
8

Ich entwickle eine Anwendung, wo ich einen Dialog haben muss, um Bilder von Galerie oder Kamera hochzuladen. Ich habe hier eine Art Lösung gefunden Dialog to pick image from gallery or from camera aber das Problem ist hier gibt es einen Konflikt beim Vergleich, welche Aktion vom Benutzer gewählt wird.Wie man Vorsatz-Auswahl für Kamera oder Galerie-Anwendung in Android wie WhatsApp bearbeiten Profil?

Ich würde gerne wissen, ob ich in diesem Code ändern kann und einige Ergebnisse zu unterscheiden, entweder Galerie oder Kamera ausgewählt ist und dann Aktion anwenden.

Antwort

11

Erstellen Sie neue Methode in Datei-Hauptaktivität genannt „selectImage()“ .. für Option wählen

private void selectImage() { 
    final CharSequence[] items = { "Take Photo", "Choose from Library", 
      "Cancel" }; 

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
    builder.setTitle("Add Photo!"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int item) { 
      if (items[item].equals("Take Photo")) { 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File f = new File(android.os.Environment 
         .getExternalStorageDirectory(), "temp.jpg"); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
       startActivityForResult(intent, REQUEST_CAMERA); 
      } else if (items[item].equals("Choose from Library")) { 
       Intent intent = new Intent(
         Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       intent.setType("image/*"); 
       startActivityForResult(
         Intent.createChooser(intent, "Select File"), 
         SELECT_FILE); 
      } else if (items[item].equals("Cancel")) { 
       dialog.dismiss(); 
      } 
     } 
    }); 
    builder.show(); 
} 

Jetzt müssen wir mit dem richtigen Ergebnis unserer Tätigkeit wieder zurück.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 
     if (requestCode == REQUEST_CAMERA) { 
      File f = new File(Environment.getExternalStorageDirectory() 
        .toString()); 
      for (File temp : f.listFiles()) { 
       if (temp.getName().equals("temp.jpg")) { 
        f = temp; 
        break; 
       } 
      } 
      try { 
       Bitmap bm; 
       BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); 

       bm = BitmapFactory.decodeFile(f.getAbsolutePath(), 
         btmapOptions); 

       // bm = Bitmap.createScaledBitmap(bm, 70, 70, true); 
       ivImage.setImageBitmap(bm); 

       String path = android.os.Environment 
         .getExternalStorageDirectory() 
         + File.separator 
         + "Phoenix" + File.separator + "default"; 
       f.delete(); 
       OutputStream fOut = null; 
       File file = new File(path, String.valueOf(System 
         .currentTimeMillis()) + ".jpg"); 
       try { 
        fOut = new FileOutputStream(file); 
        bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
        fOut.flush(); 
        fOut.close(); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else if (requestCode == SELECT_FILE) { 
      Uri selectedImageUri = data.getData(); 

      String tempPath = getPath(selectedImageUri, MainActivity.this); 
      Bitmap bm; 
      BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); 
      bm = BitmapFactory.decodeFile(tempPath, btmapOptions); 
      ivImage.setImageBitmap(bm); 
     } 
    } 
} 

Fügen Sie diese Methode in onActivity()

public String getPath(Uri uri, Activity activity) { 
    String[] projection = { MediaColumns.DATA }; 
    Cursor cursor = activity 
      .managedQuery(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 
+0

folgen Sie diesem eine wird es mehr Idee geben http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample/ –

+0

was getPath (Uri uri, Kontext Kontext) tut? Ich kann es nicht für meine Aktivitäten verwenden. – EduardoMaia

+0

Ich wünschte, ich sehe Ihren Code –

5

einfach eine Beratung, wenn Sie startActivityForResult() rufen Sie ein Foto mit der Kamera zu nehmen:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (cameraIntent.resolveActivity(getPackageManager()) != null) { 
     startActivityForResult(cameraIntent, REQUEST_CAMERA); 
} 

Beachten Sie, dass die startActivityForResult() Methode geschützt eine Bedingung, die resolveActivity() aufruft, die die erste Aktivitätskomponente zurückgibt, die die Absicht verarbeiten kann. Diese Überprüfung ist wichtig, denn wenn Sie startActivityForResult() mit einer Absicht aufrufen, die keine App verarbeiten kann, stürzt Ihre App ab. Solange das Ergebnis nicht null ist, ist es sicher, die Absicht zu verwenden.

Verwandte Themen