を含む構成済みのルートを見つけることができませんでした。私が試しているApp用にカメラで撮影した画像を保存しようとしているときにエラーが発生しました。開発する。エラーがjava.lang.IllegalArgumentException:/ storage/emulated/0/Pictures/
java.lang.IllegalArgumentExceptionがある:/ストレージが含まれて構成されたルートを見つけることができませんでした/ラインFileProvider.getUriForFileで私のコードでは、このメソッドに/ 0 /写真/ JPEG20161108_153704_
にlogcatポイントをエミュレート
private File createImageFile() throws IOException {
/* Create an image file name */
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "JPEG" + timeStamp + "_";
File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile(), imageFileName);
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
/* Tried this also, not working. Leaving for debugging.
File image = File.createTempFile(
imageFileName,
".jpg",
storageDir
);*/
File image = new File(path, imageFileName);
try {
/* Making sure the Pictures directory exist.*/
path.mkdir();
storageDir.createNewFile();
}catch (Exception e) {
e.printStackTrace();
}
/* Save a file: path for use with ACTION_VIEW intents */
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
このメソッドは、イメージファイルを作成するために使用される。..
private void dispatchTakePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(takePictureIntent); // this worked originally
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, ""+e);
}
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(TallyActivity2.this,
"com.example.bigdaddy.pipelinepipetally.fileprovider", photoFile);
takePictureIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
と呼ばれている。ここですメソッドでは、キャプチャした画像をsaveImage()メソッドで保存し、サムネイルをImageView
に設定したいと考えています。 saveImage()メソッドはバイトを返すので、ユーザーがサムネイルImageView
をクリックすると、そのバンドをインテントから別のフルスクリーンアクティビティに渡すことができます。ここで
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
/* If it's equal to my REQUEST_IMAGE_CAPTURE var, we are all good. */
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
/*Saving to the Pipe class with the saveImage() method below.*/
sDummyImagePicByte = saveImage(imageBitmap);
/* Going ahead an setting the thumbnail here for the picture taken*/
mPipePicImage.setImageBitmap(imageBitmap);
Log.i(TAG,Arrays.toString(sDummyImagePicByte)+" after assignment from saveImage()");
}
}
ここManifest.xml
ファイル
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.bigdaddy.pipelinepipetally">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<application
android:allowBackup="true"
android:debuggable="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="HardcodedDebugMode">
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".TallyActivity2"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".JobAndDbActivity"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".ExistingTallyActivity"
android:windowSoftInputMode="adjustResize">
</activity>
<activity android:name=".ImageToFullscreen"
android:windowSoftInputMode="adjustResize">
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.bigdaddy.pipelinepipetally.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
</application>
</manifest>
は(私も作成した)私が作成したfile_paths.xml
ファイルで、アプリケーション/ resを/ XML /フォルダに置かれています。これが正しい場所(フォルダの場合)であるかどうかは不明です。
<paths >
<files-path name="my_images" path="files/"/>
...
</paths>
また、これは私が必ずこの上の任意の助けに感謝onRequestPermissionsResult()
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA:
/* if request is canceled, the result arrays are empty */
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
/* Permissions granted so the mPermissionIsGranted boolean is set to true*/
mPermissionIsGranted = true;
} else {
/*
Permissions denied so the mPermissionIsGranted boolean stays false here and
providing a Toast message to the user, letting them know that camera permissions
are required for this feature.
*/
Toast.makeText(getApplicationContext(),"Camera permissions required\nfor this" +
"feature.",
Toast.LENGTH_LONG).show();
/* Continuing to hold the false setting to this boolean since not granted.*/
mPermissionIsGranted = false;
}
break;
/* For accessing and writing to the SD card*/
case MY_PERMISSIONS_REQUEST_SD_CARD:
/* if request is canceled, the result arrays are empty */
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
/* Permissions granted so the mPermissionIsGranted boolean is set to true*/
mPermissionIsGranted = true;
} else {
/*
Permissions denied so the mPermissionIsGranted boolean stays false here and
providing a Toast message to the user, letting them know that camera permissions
are required for this feature.
*/
Toast.makeText(getApplicationContext(),"SD Card permissions required\nfor this"+
"feature.",
Toast.LENGTH_LONG).show();
/* Continuing to hold the false setting to this boolean since not granted.*/
mPermissionIsGranted = false;
}
break;
/* For the GPS location permissions.*/
default: MY_PERMISSIONS_REQUEST_FINE_LOCATION:
/* Still to be implemented .*/
break;
}
}
です。私はまだ新しいAndroidを学んでいます。前もって感謝します。
お返事ありがとうございます。したがって、XMLファイル内のファイルパスは内部ファイルストレージを指していますか? – J2112O
@ J2112O:正しい。 [ドキュメント](https://developer.android.com/reference/android/support/v4/content/FileProvider.html#SpecifyFiles)を参照してください。 – CommonsWare
こんにちは@CommonsWareので、@ J2112Oは '<ファイルパス名=" my_images "path ="ファイル/ "/>'を<外部パス名= "my_images"のパス= "ファイル/"/? _files/_パスは正しいですか?何かを変えるには? – Jaco