2011-09-26 20 views

Odpowiedz

0

Nie jestem pewien, co próbujesz osiągnąć, jest przenośne na wszystkich urządzeniach. Jednym z celów Androida jest umożliwienie łatwego zastąpienia działań, które obsługują żądania, takie jak przechwytywanie obrazu. Mówiąc to, jeśli chcesz zrobić to tylko dla swojego urządzenia, możesz po prostu ustawić nazwę komponentu w zamiarze na nazwę działania przechwytywania multimediów.

+0

Aby dodać trochę tu nie zmieni zamiarów masz już w żaden sposób z wyjątkiem zadzwonić setComponent –

+1

Thanks Justin. Domyślam się, że mogę sprawdzić nazwę komponentu domyślnej kamery systemowej (com.google.android.camera), a jeśli jest obecna, użyj metody setComponent, w przeciwnym razie powróć do zwykłej metody. –

4

Jak zasugerował Dr_sulli, zamieniam go na kod i działa dobrze dla mnie, Jeśli chcesz uzyskać dostęp do bezpośredniej aplikacji kamery, a część pozwala użytkownikowi wybrać inne aplikacje kamery wraz z kamerą systemową.

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); 

wewnątrz onActivityResult robić swoje rzeczy

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 potwierdzi pakiet istnieje lub nie.

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; 
} 

czy można to zrobić w drodze jej o wiele łatwiej będzie filtrować aplikację cały układ, a później porównać nazwę stąd, że praca na wszystkich telefonem ale wyżej techniki z powodu ciężkiej kodowania nie zadziała na każdym telefonie. Później możesz użyć tej nazwy pakietu, aby rozpocząć działanie kamery, jak opisano powyżej.

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; 
      } 
     } 
    } 

Uważam następujące rozwiązania i jego pracy doskonale.

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

można filtrować domyślną kamerę, ustawiając pakiet w powyższym celu. Przetestowałem go poprzez zainstalowanie dwóch aplikacja Linia Camera i Paper Camera obie aplikacje były wyświetlane Chooser ale filtrowanie przez pakiet powyżej kodzie otwartym tylko domyślne aparatu.

0

domyślną aplikacją aparatu jest pierwsza zainstalowana aplikacja. Tak więc, pierwszym elementem camlist jest domyślna aplikacja

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); 
Powiązane problemy