アンドロイドは(のみ自動的に交換される第二のシートを取る)写真を撮るためにカメラを呼び出します

私はAndroidのWanji天は、多くの人々は、私が試した、と言う、カメラアンドロイドコール(撮影)と一緒に写真を撮るのが好き、そして生き残る、インターネットBaiduのだろう、彼の心はノートを湧き、移動しませんでし果たしたこれらの二日間7.0それは、廃棄物、それに興味を持って見て意味ので、私は、私手動でオープンなアクセス許可、書いていない許可ダイナミックに申請する許可のための7.0アプリケーションで成功し、そうでない場合は理由ダイナミックに非常に簡単に次のよう。

最初の拒絶レイアウトファイルのコード:

<xmlのバージョン= "1.0"エンコード= "UTF-8"?> 
<android.support.constraint.ConstraintLayout 
    のxmlns:アンドロイド= "http://schemas.android.com/apk/res/android" 
    のxmlns:アプリ= "http://schemas.android.com/apk/res-auto" 
    のxmlns:ツール= "http://schemas.android.com/tools" 
    のandroid:layout_width = "match_parent" 
    のandroid:layout_height = "match_parent" 
    ツール:コンテキスト= "com.example.paizhao.MainActivity"> 

    <ボタン
        アンドロイド:IDを= "@ + ID / take_photo" 
        アンドロイド:テキスト= "拍照" 
        のandroid:layout_width = "368dp" 
        のandroid:layout_height = "wrap_content" 
        ツール:layout_editor_absoluteY = "0dp" 
        ツール:layout_editor_absoluteX = "8DP" /> 

    <ImageViewの
        アンドロイド:ID = "@ + ID /絵" 
        アンドロイド:layout_width = "wrap_content" 
        のandroid:layout_height = "wrap_content" 
        アンドロイド:layout_gravity = "center_horizo​​ntal" 
        ツール:layout_editor_absoluteY = "0dp" 
        ツール:layout_editor_absoluteX = "0dp" /> 
</ android.support.constraint.ConstraintLayout>

  レイアウトコード、それは自分自身をコピーすることができますので、問題ではありません。

そして、MainActivityを初期化します。

輸入android.content.Intent; 
輸入android.graphics.Bitmap; 
輸入android.graphics.BitmapFactory; 
輸入android.net.Uri; 
輸入android.os.Build; 
輸入android.provider.MediaStore; 
輸入android.support.v4.content.FileProvider; 
輸入android.support.v7.app.AppCompatActivity; 
輸入android.os.Bundle; 
輸入android.view.View; 
輸入android.widget.Button; 
輸入android.widget.ImageView; 
インポートのjava.io.File; 
輸入java.io.FileNotFoundException。
インポートにjava.io.IOException; 

パブリッククラスMainActivityはAppCompatActivity {拡張
    プライベートボタンBTNを; //拍照按钮 
    プライベートウリImageUri; //储存图片地址
    プライベートImageViewの画像; //显示图片用的ImageViewの
    public static final int型のTAKE_PHOTO = 1; 
    保護されたボイドのonCreate(バンドルsavedInstanceState){ 
        super.onCreate(savedInstanceState)。
        setContentView(R.layout.activity_main)。
        BTN =(ボタン)findViewById(R.id.take_photo); //加上IDの
        画像=(ImageViewの)findViewById(R.id.picture)。
    } 
}

  そして、より多くの嫌なところがあります

btn.setOnClickListener(新しいView.OnClickListener(){ 
            @Override 
            ます。public void onClickの(ビューV){ 
                ファイルoutputImage =新しいファイル(getExternalCacheDir()、 "outputImage.jpg"); 
                試み{ 
                    場合(outputImage.exists()){ 
                        outputImage .delete(); 
                    } 
                    outputImage.createNewFile(); 
                }キャッチ(例外:IOException e)の{ 
                    e.printStackTrace(); 
                }  
                IF(Build.VERSION.SDK_INT> = 24){//この場所は7.0より大きいのAndroidのバージョンかどうかを判断し、もしそれが24より大きい場合、彼のバージョンが7.0以上であります
                    ImageUri = FileProvider.getUriForFile(MainActivity.this、 "com.example.paizhao.FileProvider"、outputImage); / /转型骚操作、利用FileProvider转型、由ファイル类型转成コンテンツ类型 
            外部にシステムの//アンドロイド7.0アプリケーションが禁止されています開いているファイル:// URIので、我々は移行する必要があります。
            // FileProviderは、使用するためのアプリケーション間のプライベートファイル転送がAndroidManifest前に登録されるのContentProviderのサブクラスである

          他{} 
                    ImageUri = Uri.fromFile(outputImage)
                    のSystem.out.println(ImageUri); 
                } 
                テント=インテント新しい新しいテント( "android.media.action.IMAGE_CAPTURE"); 
                intent.putExtra(MediaStore.EXTRA_OUTPUT、ImageUri); 
                startActivityForResult(テント、TAKE_PHOTO); 
            } 
        })。

表示画像:

保護された無効onActivityResult(int型requestCode、int型のresultCode、テントデータ){ 
        スイッチ(requestCode){ 
            ケースTAKE_PHOTO:
                もし(resultCodeが== RESULT_OK){ 
                    試み{ 
                        //将拍摄的照片显示出来
                        ビットマップビットマップ= BitmapFactory.decodeStream(getContentResolver() .openInputStream(ImageUri))。
                        picture.setImageBitmap(ビットマップ); 
                    }キャッチ(にFileNotFoundException電子){ 
                        e.printStackTrace(); 
                    } 
                } 
                ブレーク。
            デフォルト:
                休憩; 
        }
    }

その後で7.0以上のユニークなものである登録FileProvider AndroidManifest。

<プロバイダ
            アンドロイド:名=「android.support.v4.content.FileProvider」
            アンドロイド:当局=「com.example.paizhao.FileProvider」//いくつかの学生が直接コードをコピーし、その結果、崩壊を落ちることはありません、当局があなたのしている防ぎますパッケージ名+ FileProvider、第二引数以上FileProvider.getUriForFile、それは正確に等しくなければなりません。
            アンドロイド:エクスポート= "false"を//が直接のようにコピー休む
            アンドロイド:grantUriPermissions = "trueに"> 
            <メタデータ
                アンドロイド:名= "android.support.FILE_PROVIDER_PATHS" 
                アンドロイド:リソース= "@ XML / file_paths" /> 
        </プロバイダ>

  フレーズを追加します。またにAndroidManifest、一見以下の7.0を使用します

    <用途許可は、Android:名= "android.permission.WRITE_EXTERNAL_STORAGE" /> 
    < -调用相机权限! - > 
    <用途許可は、Android:名= "android.permission.CAMERA" />

  まあ、それを試して行きます。

おすすめ

転載: www.cnblogs.com/lichangjian/p/12326144.html