2015-01-19 2 views
2

Я пытаюсь вызвать Android камеры, используя следующий код:Android MediaStore.ACTION_IMAGE_CAPTURE Намерение Возвращение Null data.getData()

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1 && resultCode == RESULT_OK) { 
     Uri uri = data.getData(); 
     if (uri != null) Log.d("", uri.toString()); 
     else Log.d("", "uri is null."); // ...but why? It should hold the image URI. 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, 1); 
} 

Согласно документации:

"MediaStore.EXTRA_OUTPUT - Для этого параметра требуется объект Uri, указывающий путь и имя файла, в котором вы хотите сохранить изображение. Этот параметр является необязательным, но настоятельно рекомендуется. Если вы не укажете это значение, приложение камеры сохранит запрошенное изображение в местоположении по умолчанию с именем по умолчанию, указанным в возвращаемом намерении In tent.getData(). "

Это не мой опыт. Для меня этот код возвращает null для data.getData(). Я также экспериментировал с настройкой вывода Uri, но это дало мне целый ряд проблем ...

У кого-нибудь еще это было?

+0

На каком устройстве это было? Я знаю, что мне приходилось делать некоторые обходные пути в зависимости от версии устройства/версии os ... 'data' в некоторых случаях действительно« null ». – shkschneider

+0

Довольно неясный ToughShield R500 + прочный телефон: http://www.tough-shield.com/device/r500-2/ – user3352488

+0

Если 'data' сам является' null', я использовал строку с псевдо-жестким кодом, которая мне известна устройство сохраняло изображение до ... – shkschneider

ответ

1

взглянуть на этот код

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { 
    Bitmap photo = (Bitmap) data.getExtras().get("data"); 

    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

    //you can create a new file name "test.jpg" in sdcard folder. 
    File f = new File(Environment.getExternalStorageDirectory() 
          + File.separator + "test.jpg"); 
    try { 

     f.createNewFile(); 
     //write the bytes in file 
     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     // remember close de FileOutput 
     fo.close(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    if (f.exists()) { 

     Toast.makeText(this, "Image Found : "+f.getAbsolutePath().toString(), Toast.LENGTH_SHORT).show(); 

    }else{ 
      Toast.makeText(this, "Image Not Found", Toast.LENGTH_SHORT).show(); 
    } 


} 
} 

и ваши намерения должны быть

Intent cameraIntent = new Intent(
       android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, CAMERA_REQUEST); 
+0

На некоторых устройствах, с которыми я столкнулся, иногда 'data' сам по себе является нулевым. – shkschneider

+0

В этом случае вы должны сообщить камере, где нужно сохранить изображение и вспомнить ури самостоятельно: –

+0

Да, точно; используя 'Intent.putExtra (MediaStore.EXTRA_OUTPUT, yourCustomUriToRemember)'. – shkschneider

1

Пока пользователи могут использовать любое приложение камеры вы бы лучше, чтобы создать временный файл и поместить URI до EXTRA_OUTPUT. Спецификация не ясна, и не каждое приложение следует за ней. Вот метод, который я использую для резервирования файла:

public static File reserveTempFile(String directory, String extension) throws IOException { 
    final File pathFile = new File(directory); 
    if (!pathFile.exists()) { 
     final boolean result = pathFile.mkdirs(); 
     if (!result) { 
      throw new IOException("Can't create directory"); 
     } 
    } 

    File file; 
    do { 
     String fileName = Long.toString(System.nanoTime()); 
     if (Utils.isNotEmpty(extension)) { 
      fileName += "." + extension; 
     } 
     file = new File(pathFile, fileName); 
    } while (file.exists()); 

    return file; 
} 
+0

Я попытался создать объект файла mNewPhoto' и вызвать 'intent.putExtra (MediaStore.EXTRA_OUTPUT, mNewPhoto. toURI()) ;, но когда я возвращаюсь из камеры, 'mNewPhoto.exists()' ложно. Я смущен. – user3352488

Смежные вопросы