画像をクリックして外部の保存ディレクトリに保存します。そのために、私はこれを使用しています:外部ディレクトリに画像を保存する際にIllegalArgumentExceptionエラーが発生しました
public class MainActivity extends AppCompatActivity {
Button btn_pic;
ImageView iv_pic;
Context ctx = this;
Bitmap photo, bm;
String photoPath, img_dp;
private static final int CAMERA_REQUEST = 1888;
private int STORAGE_PERMISSION_CODE = 23;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_pic = (Button)findViewById(R.id.btn_pic);
iv_pic = (ImageView)findViewById(R.id.iv_pic);
btn_pic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
if(intent.resolveActivity(getPackageManager()) != null){
File photoFile = null;
try{
photoFile = createImageFile();
}
catch (Exception e){
e.printStackTrace();
}
if(photoFile != null){
Uri photoUri = FileProvider.getUriForFile(ctx, "com.example.android.fileprovider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, CAMERA_REQUEST);
}
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
photo = (Bitmap) data.getExtras().get("data");
bm = BitmapFactory.decodeFile(photoPath);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] b = byteArrayOutputStream.toByteArray();
img_dp = Base64.encodeToString(b, Base64.DEFAULT);
Log.i("image convert", img_dp);
iv_pic.setImageBitmap(photo);
}
}
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("ddmmyyyy_HHmmss").format(new Date());
String imgFileName = "JPEG_" + timeStamp;
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File img = File.createTempFile(imgFileName, ".jpg", storageDir);
photoPath = img.getAbsolutePath();
return img;
}
}
マイpaths.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.falcon.apps.imagestoragedemo/files/Pictures" />
</paths>
私は取得しています私のAndroidManifest.xmlファイル
<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/paths"></meta-data>
</provider>
でプロバイダを宣言しました次のエラー:
なぜこのエラーが発生し、解決するのですか?
Uri photoUri = FileProvider.getUriForFile(ctx, "com.example.android.fileprovider", photoFile);
ないあなただけのいくつかのオンラインソースからコピーされた場合は、com.example.android.fileprovider
を持っているか、なぜわから:
私の代わりに「com.example.android.fileprovider」の、またここに https://developer.android.com/training/camera/photobasics.html からこれをコピーし、私は私のパッケージ名を与える必要があります? –
マニフェストと 'FileProvider.getUriForFile()の両方で' com.example.android.fileprovider'を 'com.falcon.apps.fileprovider'に変更してください。 – Gavin
それを行いました。このエラーが発生しました /storage/emulated/0/Pictures/JPEG22112017_161142615705050.jpgが含まれている構成済みのルートを見つけることができませんでした –