2011-09-26 12 views

risposta

0

Non sono sicuro che ciò che si sta tentando di realizzare sia portatile su tutti i dispositivi. Uno degli obiettivi di Android è consentire la facile sostituzione di attività che richiedono servizi come l'acquisizione di immagini. Detto questo, se desideri farlo solo per il tuo dispositivo, puoi semplicemente impostare il nome del componente nell'intenzione del nome dell'attività di acquisizione multimediale.

+0

Per aggiungere un po 'qui, non si cambia l'intento è già in qualche modo, ad eccezione di chiamare setComponent –

+1

Grazie Justin. Immagino di poter controllare il nome del componente della videocamera di sistema predefinita (com.google.android.camera) e, se è presente, utilizzare l'approccio setComponent altrimenti ricorrere al solito approccio. –

4

Come suggerito da Dr_sulli, sto solo convertendo il codice in un codice e funziona bene per me, in tal caso, se l'accesso all'applicazione della telecamera diretta è possibile, è possibile consentire all'utente di scegliere altre applicazioni della fotocamera insieme alla videocamera di sistema.

protected static final int CAMERA_ACTIVITY = 100; 

Intent mIntent = null; 
     if(isPackageExists("com.google.android.camera")){ 
      mIntent= new Intent(); 
      mIntent.setPackage("com.google.android.camera"); 
      mIntent.setAction(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      mIntent.putExtra("output", Uri.fromFile(new File(Environment 
        .getExternalStorageDirectory(), "/myImage" + ".jpg"))); 
     }else{ 
     mIntent = new Intent(
       android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     mIntent.putExtra("output", Uri.fromFile(new File(Environment 
       .getExternalStorageDirectory(), "/myImage" + ".jpg"))); 

     Log.i("in onMenuItemSelected", 
       "Result code = " 
         + Environment.getExternalStorageDirectory()); 
     } 
     startActivityForResult(mIntent, CAMERA_ACTIVITY); 

all'interno onActivityResult fare le tue cose

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.i("in onActivityResult", "Result code = " + resultCode); 
    if (resultCode == -1) { 
     switch (requestCode) { 
     case CAMERA_ACTIVITY: 
      //do your stuff here, i am just calling the path of stored image 
      String filePath = Environment.getExternalStorageDirectory() 
        + "/myImage" + ".jpg"; 
        } 
        } 
       } 

isPackageExists confermeranno il pacchetto esistano o meno.

public boolean isPackageExists(String targetPackage){ 
    List<ApplicationInfo> packages; 
    PackageManager pm; 
     pm = getPackageManager();   
     packages = pm.getInstalledApplications(0); 
     for (ApplicationInfo packageInfo : packages) { 
    if(packageInfo.packageName.equals(targetPackage)) return true; 
    }   
    return false; 
} 

O si può fare a modo mio la sua molto più facile, questo sarà filtrare l'applicazione per tutti i sistemi e poi si confronta il nome di conseguenza funziona su tutti i telefoni, ma la tecnica di cui sopra a causa di codifica difficile non funzionerà su ogni telefono. Successivamente è possibile utilizzare questo nome del pacchetto per avviare l'attività della telecamera come descritto sopra.

PackageManager pm = this.getPackageManager(); 

    List<ApplicationInfo> list = getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); 
    for (int n=0;n<list.size();n++) { 
     if((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM)==1) 
     { 
      Log.d("Installed Applications", list.get(n).loadLabel(pm).toString()); 
      Log.d("package name", list.get(n).packageName); 
      if(list.get(n).loadLabel(pm).toString().equalsIgnoreCase("Camera")) 
       break; 
     } 
    } 
1
List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); 
    for (int n=0;n<list.size();n++) { 
     if((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM)==1) 
     { 
      Log.d("TAG", "Installed Applications : " + list.get(n).loadLabel(packageManager).toString()); 
      Log.d("TAG", "package name : " + list.get(n).packageName); 
      if(list.get(n).loadLabel(packageManager).toString().equalsIgnoreCase("Camera")) { 
       defaultCameraPackage = list.get(n).packageName; 
       break; 
      } 
     } 
    } 

Trovo seguente soluzione e la sua perfettamente funzionante.

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
takePictureIntent.setPackage(defaultCameraPackage); 
startActivityForResult(takePictureIntent, actionCode); 

è possibile filtrare la videocamera predefinita impostando il pacchetto in alto. Ho provato con l'installazione di due applicazioni linea di fotocamere e Camera di carta entrambe le applicazioni sono state mostrando di selezione, ma di filtraggio per pacchetto di cui sopra codice aperto solo di default della fotocamera.

0

l'app fotocamera predefinita è la prima è stata installata. Così, il primo elemento camlist è l'applicazione predefinita

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    PackageManager packageManager = MapsActivity.this.getPackageManager(); 
    List<ResolveInfo> listCam = packageManager.queryIntentActivities(intent, 0); 
    intent.setPackage(listCam.get(0).activityInfo.packageName); 
    startActivityForResult(intent,INTENT_REQUESTCODE1); 
Problemi correlati