{"id":182,"date":"2019-01-13T22:24:00","date_gmt":"2019-01-13T21:24:00","guid":{"rendered":"http:\/\/android.wp.w3.pt\/?p=182"},"modified":"2019-01-13T22:28:47","modified_gmt":"2019-01-13T21:28:47","slug":"tirar-uma-foto-e-gravar-a-imagem","status":"publish","type":"post","link":"http:\/\/android.w3.pt\/?p=182","title":{"rendered":"Tirar uma foto e gravar a imagem"},"content":{"rendered":"<p>Estive a fazer um programa em Java, para Android, que permite o utilizador tirar uma foto e grav\u00e1-la no dispositivo.<\/p>\n<p>Como em todos os projetos, surgiram muitos percal\u00e7os, mas o mais complexo foi a dificuldade em gravar a foto.<\/p>\n<p>O erro que surgia era o seguinte:<\/p>\n<p><code>FileProvider - IllegalArgumentException: Failed to find configured root<\/code><\/p>\n<p>E, aparentemente, tinha a ver com uma falta de permiss\u00f5es para escrever na diretoria pretendida, embora eu tenha feito tudo exatamente como estava indicado nos exemplos do <a href=\"https:\/\/developer.android.com\/training\/camera\/photobasics#java\">Android developers<\/a>.<\/p>\n<p>Basicamente pode fazer-se tudo como est\u00e1 indicado no site do Android, exceto o conte\u00fado do ficheiro file_paths.xml, que deve ser alterado para o seguinte, conforme a resposta n\u00famero seis <a href=\"https:\/\/stackoverflow.com\/questions\/42516126\/fileprovider-illegalargumentexception-failed-to-find-configured-root\/42516202\">desta p\u00e1gina<\/a> do stackoverflow.<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;paths xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;\r\n    &lt;external-path\r\n        name=\"external\"\r\n        path=\".\" \/&gt;\r\n    &lt;external-files-path\r\n        name=\"external_files\"\r\n        path=\".\" \/&gt;\r\n    &lt;cache-path\r\n        name=\"cache\"\r\n        path=\".\" \/&gt;\r\n    &lt;external-cache-path\r\n        name=\"external_cache\"\r\n        path=\".\" \/&gt;\r\n    &lt;files-path\r\n        name=\"files\"\r\n        path=\".\" \/&gt;\r\n&lt;\/paths&gt;<\/pre>\n<p>Quanto ao resto do c\u00f3digo, aqui fica o c\u00f3digo Java, incluindo o processo de pedir permiss\u00f5es ao utilizador para usar a c\u00e2mara e o sd card. Basta chamar a fun\u00e7\u00e3o <strong>takePhoto()<\/strong>.<\/p>\n<pre>public void takePhoto() {\r\n       if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {\r\n           ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);\r\n       } else {\r\n           takePhoto2();\r\n       }\r\n   }\r\n\r\n   public void takePhoto2() {\r\n       if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {\r\n           ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_READ_EXTERNAL_STORAGE);\r\n       } else {\r\n           takePhoto3();\r\n       }\r\n   }\r\n\r\n   public void takePhoto3() {\r\n       if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {\r\n           ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_WRITE_EXTERNAL_STORAGE);\r\n       } else {\r\n           takePhoto4();\r\n       }\r\n   }\r\n\r\n   public void takePhoto4() {\r\n       if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||\r\n               ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||\r\n               ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED\r\n               ) {\r\n           Log.d(\"ERROR\", \"No permissions!!!\");\r\n           \/\/Toast.makeText(this, \"No permission to take photos\", Toast.LENGTH_LONG).show();\r\n           return;\r\n       } else {\r\n      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);\r\n      if (takePictureIntent.resolveActivity(getPackageManager()) != null) {\r\n         photoFile = null;\r\n         photoFile = getFile();\r\n         if (photoFile != null) {\r\n            photoURI = FileProvider.getUriForFile(this,\"pt.ulusofona.c3places.fileprovider\", photoFile);\r\n\r\n                   takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);\r\n            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);\r\n         } else {\r\n                   Toast.makeText(this, \"Problems with the images folder\", Toast.LENGTH_LONG).show();\r\n               }\r\n      }\r\n   }\r\n   }\r\n\r\n   String mCurrentPhotoPath;\r\n   File photoFolder;\r\n   String imageFileName;\r\n   File photoFile;\r\n   final static int REQUEST_TAKE_PHOTO = 121;\r\n   final static int MAX_IMAGE_DIM = 480;\r\n\r\n   private File getFile() {\r\n       photoFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);\r\n\r\n       if(!photoFolder.exists()) { photoFolder.mkdir(); }\r\n\r\n       String timeStamp = new SimpleDateFormat(\"yyyyMMdd_HHmmss\").format(new Date());\r\n       imageFileName = \"JPEG_\"+ timeStamp;\r\n       File image_file = null;\r\n\r\n       try {\r\n           image_file = File.createTempFile(imageFileName + \"_\",\".jpg\",photoFolder);\r\n           mCurrentPhotoPath = image_file.getAbsolutePath();\r\n       } catch (IOException e) {\r\n           e.printStackTrace();\r\n       }\r\n\r\n       return image_file;\r\n   }\r\n\r\n   @Override\r\n   protected void onActivityResult(int requestCode, int resultCode, Intent intent) {\r\n    super.onActivityResult(requestCode, resultCode, intent);\r\n    switch(requestCode) {\r\n        case REQUEST_TAKE_PHOTO:\r\n         try {\r\n            Bitmap in = MediaStore.Images.Media.getBitmap(getContentResolver(),photoURI);\r\n            int max = Math.max(in.getWidth(), in.getHeight());\r\n            max = (int)(max\/MAX_IMAGE_DIM);\r\n            int larg = (int)(in.getWidth()\/max);\r\n            int alt = (int)(in.getHeight()\/max);\r\n            Bitmap out = Bitmap.createScaledBitmap(in, larg, alt, false);\r\n            File file = new File(photoFolder, imageFileName + \".png\");\r\n            FileOutputStream fOut;\r\n            fOut = new FileOutputStream(file);\r\n            out.compress(Bitmap.CompressFormat.PNG, 100, fOut);\r\n            fOut.flush();\r\n            fOut.close();\r\n            in.recycle();\r\n            out.recycle();\r\n            photoFile.delete();\r\n         }catch (Exception e){\r\n            e.printStackTrace();\r\n         }\r\n         break;\r\n    }\r\n}<\/pre>\n<p>Na fun\u00e7\u00e3o <strong>onActivityResult()<\/strong>, antes de gravar a foto, redimensiono-a.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Estive a fazer um programa em Java, para Android, que permite o utilizador tirar uma foto e grav\u00e1-la no dispositivo. Como em todos os projetos, surgiram muitos percal\u00e7os, mas o mais complexo foi a dificuldade em gravar a foto. O erro que surgia era o seguinte: FileProvider &#8211; IllegalArgumentException: Failed to find configured root E, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/182"}],"collection":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=182"}],"version-history":[{"count":3,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/182\/revisions"}],"predecessor-version":[{"id":185,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/182\/revisions\/185"}],"wp:attachment":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=182"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}