2017-06-22 11 views
-2

画像をクリックして外部の保存ディレクトリに保存します。そのために、私はこれを使用しています:外部ディレクトリに画像を保存する際に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> 

でプロバイダを宣言しました次のエラー:

The error I am getting

なぜこのエラーが発生し、解決するのですか?

Uri photoUri = FileProvider.getUriForFile(ctx, "com.example.android.fileprovider", photoFile); 

ないあなただけのいくつかのオンラインソースからコピーされた場合は、com.example.android.fileproviderを持っているか、なぜわから:

答えて

0

これで数時間の検索と試しを経て、ついにこの問題を解決しました。特定のパスを指定していないので、getExternalStoragePublicDirectory()と呼んでいたので、paths.xmlファイルにパスを指定する必要はありませんでした。

修正paths.xmlファイル:ここで

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 

<external-path name="my_images"/> 

</paths> 

、外部経路タグはgetExternalStoragePublicDirectory()/getExternalStorageDirectory()を呼び出すのと同じです。

0

あなたのコードは、この行を除いて大丈夫そうです。

これをチェックするAndroid Documentation for Saving Filesそれはあなたが必要とする正確なコードを持っています。

編集:リンク

EDIT2:また出て解決していない場合IllegalArgumentExceptionであなたのマニフェストを確認してください。

+0

私の代わりに「com.example.android.fileprovider」の、またここに https://developer.android.com/training/camera/photobasics.html からこれをコピーし、私は私のパッケージ名を与える必要があります? –

+0

マニフェストと 'FileProvider.getUriForFile()の両方で' com.example.android.fileprovider'を 'com.falcon.apps.fileprovider'に変更してください。 – Gavin

+0

それを行いました。このエラーが発生しました /storage/emulated/0/Pictures/JPEG22112017_161142615705050.jpgが含まれている構成済みのルートを見つけることができませんでした –

関連する問題