Ao usá-lo, basta copiá-lo e você pode escrever as observações necessárias. Bem-vindo à orientação dos deuses. Alguns códigos são reunidos e, em seguida, meu próprio resumo.
Primeiro configure:
Configure-o no arquivo de manifesto
< provider android : name = "android.support.v4.content.FileProvider" android : authority = "(你 的 包 名) .fileprovider" android : export = "false" android : grantUriPermissions = "true" > < meta-dados android : name = "android.support.FILE_PROVIDER_PATHS" android : resource = "@ xml / file_paths" > </ meta-data > </ provider >
Crie uma pasta xml sob o arquivo rec e crie um arquivo xml dentro
< Caminhos xmlns: android = "http://schemas.android.com/apk/res/android" > < -caminho externo name = "external_files" path = "" /> </ caminhos >O código java é o seguinte:
/ ** * using the camera * / Private void useCamera () { the Intent Intent = new the Intent (MediaStore. ACTION_IMAGE_CAPTURE ); File = new new File (Environment. GetExternalStorageDirectory () .getAbsolutePath () + "/ Test /" + the System. Com currentTimeMillis ( ) + ".jpg" ); file .getParentFile (). mkdirs (); // Alterar Uri com.xykj.customview.fileprovider para ser consistente com xml Uri uri = FileProvider. getUriForFile ( isto , "com.example.administrator.myapplication.fileprovider" , arquivo ); // 添加 权限 intent.addFlags (Intent. FLAG_GRANT_READ_URI_PERMISSION ); intent.putExtra (MediaStore. EXTRA_OUTPUT , uri); startActivityForResult (intenção, REQUEST_CAMERA ); } public void applyWritePermission () { String [] permissions = {Manifest.permission. WRITE_EXTERNAL_STORAGE }; if (Build.VERSION. SDK_INT > = 23 ) { int check = ContextCompat. checkSelfPermission ( this , permissions [ 0 ]); // Se a permissão foi concedida GRANTED --- autorizada DINIED --- rejeitada if (check == PackageManager. PERMISSION_GRANTED ) { // call camera useCamera (); } else { requestPermissions ( new String [ ] {Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1 ); } } else { useCamera (); } } @Override public void onRequestPermissionsResult ( int requestCode, @NonNull String [] permissões, @NonNull int [] grantResults) { super- .onRequestPermissionsResult (requestCode, permissões, grantResults); se (requestCode == 1 && grantResults [ 0 ] == PackageManager. PERMISSION_GRANTED ) { useCamera (); } else { // Não obteve permissão, solicitou novamente ou fechou o aplicativo Toast. MakeText ( this , "storage permission required" , Toast. LENGTH_SHORT ) .show (); } } @Override protegido void onActivityResult ( int requestCode, int resultCode, Intent data) { super .onActivityResult (requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK ) { // Log.e ("TAG", "---------" + FileProvider.getUriForFile (this, "com.xykj.customview.fileprovider" , Arquivo)); // 在 手机 相册 中 显示 刚 拍摄 的 图片 if (Build.VERSION. SDK_INT > = Build.VERSION_CODES. N ) { Intent mediaScanIntent = new Intent (Intent. ACTION_MEDIA_SCANNER_SCAN_FILE ); Uri contentUri = Uri. FromFile ( arquivo ); String path = contentUri.getPath (); Log. E ( "TAGSSSSSSSSS" , contentUri.toString ()); // Caminho do arquivo String absolutePath = file .getAbsolutePath (); // O nome do arquivo String pai = arquivo .getName (); Log. E ( "TAGQQQQQQQQQ" , pai + "===" + absolutePath); mediaScanIntent.setData (contentUri); sendBroadcast (mediaScanIntent); // Definir imagem imagem .setImageBitmap (BitmapFactory. decodeFile ( arquivo .getAbsolutePath ())); } else { Arquivo photoFile = new File ( photoPath ); if (photoFile.exists ()) { // Carregar a imagem no bitmap através do endereço da imagem Bitmap bm = BitmapFactory. DecodeFile (photoFile.getAbsolutePath ()); // Exibir a foto capturada na interface // Este é o caminho retornado // results.confirm (pathsa); Toast. MakeText (MainActivity. This , "Pass" , Torrada.LENGTH_LONG ) .show (); } else { Toast.MakeText(MainActivity. This , "O arquivo de imagem não existe" , Toast. LENGTH_LONG ) .show (); } } } } / ** * O caminho da foto * / public void jsPath () { // Obter estado montado no cartão SD String = Environment state.getExternalStorageState(); IF (. state.equals (Environment MEDIA_MOUNTED )) { // salvar o caminho da imagem é fornecido pelo PhotoPath = SAVED_IMAGE_PATH + "/" + System. CurrentTimeMillis () + ".png" ; Arquivo imageDir = new File ( photoPath ); if (! ImageDir.exists ()) { try { // Gerar um novo arquivo com base em um endereço de arquivo Salve a foto imageDir.createNewFile (); } catch (IOException e) { e.printStackTrace (); } } takePhotoByMethod1 (); } else { Toast. MakeText (MainActivity. This, "O cartão SD não está inserido" , Toast. LENGTH_SHORT ) .show (); } } private void takePhotoByMethod1 () { // Instancie o intent, aponte para a câmera Intent intent = new Intent (MediaStore. ACTION_IMAGE_CAPTURE ); // Instancie de acordo com o caminho Arquivo de imagem Arquivo photoFile = new File ( photoPath ); // Definir a imagem a ser salva no arquivo depois de tirar uma foto intent.putExtra (MediaStore. EXTRA_OUTPUT , Uri. FromFile (photoFile)); // Iniciar a atividade da foto e obter os dados de retorno startActivityForResult (intent, REQUEST_CAMERA ); }
O código acima é o código de execução necessário.
abaixo:
switch (v.getId()) { case R.id.take_photo: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ applyWritePermission(); }else{ jsPath(); } break;
}
点击这个按钮就可以实现, 新手第一 次写 请多多指教。