Androidは8.0.6.0に適応して携帯電話の電源を入れ、写真を撮って写真のパスを取得します

 使用するときは、コピーするだけで必要なコメントを書くことができます。神々の導きへようこそ。いくつかのコードをつなぎ合わせてから、私自身の要約を書きます。

最初の構成:

マニフェストファイルで構成します

< provider
 android :name = "android.support.v4.content.FileProvider"
 android :authorities = "(你的包名).fileprovider"
 android :exported = "false"
 android :grantUriPermissions = "true" > 
    <メタデータ
android :name = "android.support.FILE_PROVIDER_PATHS"
 android :resource = "@ xml / file_paths" > </メタデータ> 
</プロバイダー>                                

recファイルの下にxmlフォルダーを作成し、内部にxmlファイルを作成します

<パスxmlns:android = "http://schemas.android.com/apk/res/android" > 
    <外部パス名= "external_files"パス= "。" /> 
</パス>
Javaコードは次のとおりです。
/ **
      *カメラを使用して
     * /
プライベート無効useCamera(){
        テントテント=新しい新しいテント(メディアストア。 ACTION_IMAGE_CAPTURE);
        ファイル=新しい新しいファイル(環境。 GetExternalStorageDirectory().getAbsolutePath()
                + "/テスト/" +システム。とにcurrentTimeMillis( )+ ".jpg");
         file .getParentFile()。mkdirs(); // Uri com.xykj.customview.fileproviderを変更して、xmlと一致させます
Uri uri = FileProvider。getUriForFile this    

                "com.example.administrator.myapplication.fileprovider" file);
        //最小URL限
        intent.addFlags( Intent。FLAG_GRANT_READ_URI_PERMISSION); 

        intent.putExtra(。メディアストアEXTRA_OUTPUT、URI)。
        startActivityForResult(intent、 REQUEST_CAMERA); 
    } public void applyWritePermission(){
        String []パーミッション= {Manifest.permission。WRITE_EXTERNAL_STORAGE }; もし(Build.VERSION。 SDK_INT > = 23){
             int型のチェック= ContextCompat。checkSelfPermission
    


        この、パーミッション[ 0 ]);
             //かどうかは、権限が付与付与されているが---拒否--- DINIEDを承認し
た場合。(チェック== PackageManager PERMISSION_GRANTED {)
                 //コールカメラ
useCamera();
            }{
                requestPermissions(新しい文字列[ ] {Manifest.permission。 WRITE_EXTERNAL_STORAGE }、 1);
            }
        }{
            useCamera();
        }
    } @Override
公共ボイドonRequestPermissionsResult( INT requestCode、                            

        @NonNullのString []権限、
                                            @NonNull INT [] grantResults){
        スーパー.onRequestPermissionsResult(requestCode、パーミッション、grantResults);
        場合(requestCode == 1 && grantResults [ 0 ] == PackageManager。PERMISSION_GRANTED){ 
            useCamera(); 
        }そう{
             //権限を取得できなかった、アプリを再リクエストまたは閉じる
            Toast .makeTextthis"ストレージ権限が必要"、Toast .LENGTH_SHORT).show(); 
        } 
    } @Override

        protected 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" 、ファイル));
            //在手机相册中显示刚拍摄的
图片場合(Build.VERSION SDK_INT。> = Build.VERSION_CODES N){
                意図mediaScanIntent =新しいインテント(意図。 ACTION_MEDIA_SCANNER_SCAN_FILE)。            
                Uri contentUri = Uri .fromFilefile); 
                String path = contentUri.getPath(); 
                Log .e"TAGSSSSSSSSS"、contentUri.toString());
                 //ファイルパス
StringabsolutePath                 = file .getAbsolutePath();
                 //名前
のファイル                文字列の親=ファイル.getName();
                ログイン。E"TAGQQQQQQQQQ" 親+ "===" + absolutePath); 
                mediaScanIntent.setData(contentUri); 
                sendBroadcast(mediaScanIntent); //設定されたピクチャ

                                .setImageBitmap(BitmapFactory。 decodeFileファイル.getAbsolutePath()));
            }{
                ファイルで、photoFileが=新しいファイル( photoPathを);
                場合(photoFile.exists()){
                     //絵アドレスを使用してビットマップに画像をロードする
                    ビットマップBM 。= BitmapFactory decodeFile(photoFile.getAbsolutePath());
                     //インターフェイス上で撮影した写真を表示します
                    。これは、返されるパスである。//
 // results.confirm(pathsa)
                    トーストMAKETEXT。(MainActivityこの "合格"、トースト。LENGTH_LONG).SHOW();
                }{
                    トースト。MAKETEXT(MainActivity。この "画像ファイルが存在しない"、トースト。 LENGTH_LONG).SHOW();
                }
            }
        }
    } / **
      *写真のパス
     * /
パブリックvoid jsPath(){
         // SDカードのマウント状態を取得
String =環境状態。getExternalStorageState();
         IF(。state.equals(Environment MEDIA_MOUNTED)){ //画像パスを保存
するPhotoPath = SAVED_IMAGE_PATH

                

                        + "/"。+システムにcurrentTimeMillis()+ ".pngを" ;

            ファイルIMAGEDIR =新しいファイル(photoPath);
            場合(!imageDir.exists()){
                試み{
                     //はのためのファイルアドレスに基づいて新しいファイルを生成します写真の保存
                    ; imageDir.createNewFile()
                }キャッチ(のIOException e)の{ 
                    e.printStackTrace(); 
                } 
            } 
            takePhotoByMethod1(); 
        }{ 
            。トーストMAKETEXT。(MainActivityこの"SDカードが挿入されていない"。トースト、LENGTH_SHORT ; .SHOW())
        } 
    }プライベートボイドtakePhotoByMethod1(){
         //インスタンス化の意図、カメラをポイント
意図意図=新しいテント(メディアストア。ACTION_IMAGE_CAPTURE);
         //インスタンス化は、経路に従って画像ファイル
で、photoFileは=ファイルの新しいファイル(photoPathを);
         //セットの写真を撮った後、ファイルに保存するピクチャ
intent.putExtra(メディアストア。EXTRA_OUTPUT、ウリ。fromFileの(で、photoFile));
         //スタート写真活動とリターンデータ取得
startActivityForResult(意図を、REQUEST_CAMERA); 
    }
                                    
上記は必要な実行コードです。

未満:

switch (v.getId()) {
    case R.id.take_photo:
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            applyWritePermission();
        }else{
            jsPath();
        }
        break;
}

点击这个按钮就可以实现, 新手第一 次写 请多多指教。

おすすめ

転載: blog.csdn.net/q992767879/article/details/79654733