2016-10-15 2 views
0

Я использую этот код для запуска камеры, чтобы сделать снимок. Все берутся из HERE шаг за шагом (полноразмерный вариант камеры)Сбой с камеры

private void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { 

      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 
       // Error occurred while creating the File 

      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       Uri photoURI = FileProvider.getUriForFile(getActivity(), "com.example.android.fileprovider", photoFile); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
      } 
     } 
    } 

    private File createImageFile() throws IOException { 
      // Create an image file name 
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
      String imageFileName = "JPEG_" + timeStamp + "_"; 
      File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
      File image = File.createTempFile(imageFileName, ".jpg",storageDir); 

     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
     Toast.makeText(getActivity(), mCurrentPhotoPath, Toast.LENGTH_SHORT).show(); 
     return image; 
    } 

Это мой Manifest файл:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.terrormachine.swipeapp"> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.example.android.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_paths"> 
     </meta-data> 
        </provider> 

<activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

и мои пути XML:

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
        <external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" /> 
</paths> 

и я получаю эта ошибка:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.terrormachine.swipeapp/files/Pictures/JPEG_20161015_211933_-593154643.jpg 

Немного удивительно, так как файл «shell» есть (в этом месте). I fount THIS нить, но я не могу понять вещь ... вы можете объяснить это по-человечески? Любое решение приветствуется! Это важный проект, и мне нужно закончить как можно больше, и это огромная остановка.

+1

Обновить текущую версию библиотек поддержки. Затем используйте 'external-files-path' вместо' external-path', заменяя 'path' только' Pictures'. Кроме того, [вам необходимо предоставить разрешения] (https://commonsware.com/blog/2016/08/31/granting-permissions-uri-intent-extra.html) на 'Uri', в противном случае приложение камеры использует пользователя выбор не сможет использовать 'Uri'. См. [Это пример приложения] (https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider) для примера использования 'FileProvider' с' ACTION_IMAGE_CAPTURE', хотя я использую внутреннее хранилище, а не внешнее место хранения. – CommonsWare

ответ

1

В файле files_path.xml необходимо заменить com.example.package.name с именем вашего приложения, как описано на сайте разработчиков.

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="Android/data/com.example.terrormachine.swipeapp/files/Pictures" /> 
</paths> 

Также добавьте разрешение камеры в файл AndroidManifest.xml.

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" 
       android:required="true" /> 
+0

Спасибо, человек. Жизнеспособность и быстрая реакция! – nephilimrising

1

Я думаю, что вам не хватает "использует функцию-андроид: имя =" android.hardware.camera "Android: требуется = "истина"" в манифесте.

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