2016-08-22 1 views
0

Ich schrieb einen Code, um ein Bild zu machen und auf externen Speicher zu speichern. Wenn ich die App starte und das Bild mache, erhalte ich die Datei Not Found Exception.Android-Datei nicht gefunden Ausnahme durch Speichern eines Fotos

ist hier mein Code:

public class CameraActivity extends BaseActivity { 

    //variables for navigation drawer 
    private String[] navMenuTitles; 
    private TypedArray navMenuIcons; 

    //request code 
    private static final int ACTIVITY_START_CAMERA_APP = 1777; 

    //ImageView for the thumbnail 
    private ImageView mPhotoCapturedImageView; 

    //File for folder 
    private File folder; 

    //variable for timestamp 
    String timeStamp = ""; 

    //Requestcode for external Storage Permission 
    final int REQ_CODE_EXTERNAL_STORAGE_PERMISSION = 42;  

    //FloatAction Button to save the picture 
    private FloatingActionButton save; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera);  

     /* 
     * Initialize nav draw items 
     */ 

     //load title from String.xml 
     navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

     //load icons from String.xml 
     navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons); 

     //set title and icons 
     set(navMenuTitles, navMenuIcons); 

     //initialize ImageView 
     mPhotoCapturedImageView = (ImageView) findViewById(R.id.imgViewThumbNail); 

     //creat new intent for the camera app 
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 

    //creat and set a timestamp 
    timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 

    //check if permission granted 
     if (ActivityCompat.checkSelfPermission(CameraActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED) { 
      if (folder == null) { 
       createFolder(); 
      } 
     } else { 
      ActivityCompat.requestPermissions(CameraActivity.this, new String[] 
        {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_CODE_EXTERNAL_STORAGE_PERMISSION); 
     }  

    /* 
    //create a file with timestamp as title and save it in the folder 
    File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + 
    File.separator + "MyIdea" + File.separator + "IdeaGallery" + File.separator + 
    "IMG_" + timeStamp + ".jpg"); */ 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(folder)); 
    //start the camera app 
    startActivityForResult(intent, ACTIVITY_START_CAMERA_APP); 
} 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     //Check that request code matches ours: 
     if (requestCode == ACTIVITY_START_CAMERA_APP) 
     { 
       File foto = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + 
         "/Pictures/", "MyIdea/IdeaGalery/" + 
         "IMG_" + timeStamp + ".jpg"); 
       Bitmap bitmap = decodeSampledBitmapFromFile(foto.getPath(), 1000, 700); 
       mPhotoCapturedImageView.setImageBitmap(bitmap); 
       MediaScannerConnection.scanFile(CameraActivity.this, new String[]{foto.getPath()}, new String[]{"image/jpeg"}, null); 

      //Get our saved file into a bitmap object: 
      //File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator + "MyIdea" + File.separator + "IdeaGallery" + File.separator + "IMG_" + timeStamp + ".jpg"); 
      //Bitmap photoCapturedBitmap = BitmapFactory.decodeFile(mImageFileLocation); 
     } 
    } 

    public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) 
    { // BEST QUALITY MATCH 

     //First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(path, options); 

     // Calculate inSampleSize, Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     options.inPreferredConfig = Bitmap.Config.RGB_565; 
     int inSampleSize = 1; 

     if (height > reqHeight) 
     { 
      inSampleSize = Math.round((float)height/(float)reqHeight); 
     } 
     int expectedWidth = width/inSampleSize; 

     if (expectedWidth > reqWidth) 
     { 
      inSampleSize = Math.round((float)width/(float)reqWidth); 
     } 

     options.inSampleSize = inSampleSize; 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false;  
     return BitmapFactory.decodeFile(path, options); 
    } 

    private void createFolder() { 

     folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/", "MyIdea/IdeaGalery/" + 
      "IMG_" + timeStamp + ".jpg"); 
     folder.mkdir(); 
     Toast.makeText(getApplicationContext(), "Folder created", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     if (requestCode == REQ_CODE_EXTERNAL_STORAGE_PERMISSION && grantResults.length > 0 && 
       grantResults [0] == PackageManager.PERMISSION_GRANTED) { 
      createFolder(); 
     } 
    } 
} 

Die Erlaubnis auf Android Manifest gesetzt als

wurden
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

jemand bitte helfen kann mir helfen, den Fehler zu finden?

+0

Warum sind Sie ein Komma zwischen der Pfad der Datei? – Chordin4tion

+0

Gute Frage: D. Ich reparierte es in 'folder = new File (Environment.getExternalStorageDirectory() getAbsolutePath() + "/ Bilder/MyIdea/IdeaGalery /" + "IMG_" + timestamp + ".jpg".);' Aber die Datei nicht gefunden Ausnahme ist immer noch da. – dudi

+0

Bitte schreiben Sie die komplette Nachricht .. Und sagen Sie, welche Anweisung diese Nachricht verursacht. – greenapps

Antwort

0

Ich habe meinen Code aufgeräumt und ich hoffe, Sie können ihn besser verstehen. Zuerst überprüfe ich, ob der Ordner existiert, wenn nicht, erstelle ich ihn. Dann erstelle ich eine Datei für das Bild. Dann erstelle ich aus dem Bild einen Uri und setze ihn so, dass er die Extra-Methode in der Absicht aktiviert.

Auf Aktivität Ergebnis, ich lese die URI aus den Daten und wickle es in eine Zeichenfolge.

Hier ist mein neuer Code:

//check if imageFolder already exist 
    if (imageFolder == null) { 
     //create folder if don't exist 
     imageFolder = new File(Environment.getExternalStorageDirectory(), "MyIdea/IdeaGallery/"); 
     imageFolder.mkdir(); 
    } 

    //create imageFile 
    image = new File(imageFolder, "IMG_" + timeStamp + ".jpg"); 

    //get the uri of the imageFile 
    Uri uriSavedImage = Uri.fromFile(image); 

    //put uri path of the image to the intent 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 
    //start the camera app 
    startActivityForResult(intent, ACTIVITY_START_CAMERA_APP); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    //Check that request code matches ours: 
    if (requestCode == ACTIVITY_START_CAMERA_APP) 
    { 
     if (resultCode == RESULT_OK) { 
      //Get our saved file into a bitmap object: 
      Bitmap bitmap = decodeSampledBitmapFromFile(String.valueOf(data.getData()), 1000, 700); 
      mPhotoCapturedImageView.setImageBitmap(bitmap); 
      MediaScannerConnection.scanFile(CameraActivity.this, new String[]{image.getPath()}, 
        new String[]{"image/jpeg"}, null); 
     } 
    } 
} 

Wenn ich auf dem Android-Monitor sehen, ich kann die FileNotFound Ausnahme finden. Aber wenn ich mein Gerät überprüfe, kann ich keine Ordner oder Bilder darauf finden. Diese Nachrichten auf dem Android-Monitor sind zeigen:

08-22 12: 41: 08.302 17.152 bis 17.196/com.example.dudi.myidea I/Adreno-EGL: QUALCOMM Körperbau: 10/21/15 , 369a2ea, I96aee987eb 08-22 12: 41: 08.303 17152-17196/com.beispiel.ududi.myidea I/OpenGLRenderer: Initialisierte EGL, Version 1.4 08-22 12: 41: 08.827 17152-17189/com.example. dudi.myidea W/Einstellungen: Die Einstellung "airplane_mode_on" wurde von "android.provider.Settings.System" auf "android.provider.Settings.Global" umgestellt und gibt den schreibgeschützten Wert zurück. 08-22 12: 41: 08.882 17152-17152/com.beispiel.ududi.myidea I/Choreograph: 37 Frames übersprungen! Die Anwendung führt möglicherweise zu viel Arbeit an ihrem Hauptthread aus. Dezember 08-22: 41: 08.906 17.152 bis 17.196/com.example.dudi.myidea V/render: 0xa00bc000 Abschuss Gewinde (s), CPUs 4

+0

Ok mit einer else-Anweisung auf resultCode ich fand heraus, dass resultCode 0 zurückgibt. – dudi

0

Finaly sah ich Android Developer Tutorial und änderte meinen Code wie die Beispiele im Tutorial. Jetzt funktioniert es gut. Hier ist mein Arbeitscode:

public class CameraActivity extends BaseActivity { 

//variables for navigation drawer 
private String[] navMenuTitles; 
private TypedArray navMenuIcons; 

//request code 
private static final int ACTIVITY_START_CAMERA_APP = 1777; 

//ImageView for the thumbnail 
private ImageView mPhotoCapturedImageView; 

//variable for timestamp 
//String timeStamp = ""; 

private static final int MEDIA_TYPE_IMAGE = 1; 
private Uri fileUri; 

//File for folder 
//private File imageFolder; 

//File for image; 
//private File image; 


//FloatAction Button to save the picture 
private FloatingActionButton save; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera); 


    /* 
    * Initialize nav draw items 
    */ 

    //load title from String.xml 
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

    //load icons from String.xml 
    navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons); 

    //set title and icons 
    set(navMenuTitles, navMenuIcons); 

    //initialize ImageView 
    mPhotoCapturedImageView = (ImageView) findViewById(R.id.imgViewThumbNail); 

    //initialize Camera Intent 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    //set file uri 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

    //put Extra for onActivityResult 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    //start camera app 
    startActivityForResult(intent, ACTIVITY_START_CAMERA_APP); 

} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    //Check that request code matches ours 
    if (requestCode == ACTIVITY_START_CAMERA_APP) 
    { 
     if (resultCode == RESULT_OK) { 
      //Get our saved file into a bitmap object: 
      Bitmap bitmap = decodeSampledBitmapFromFile(fileUri.getPath(), 1000, 700); 
      mPhotoCapturedImageView.setImageBitmap(bitmap); 
      MediaScannerConnection.scanFile(CameraActivity.this, new String[]{fileUri.getPath()}, 
        new String[]{"image/jpeg"}, null); 
     } else if (requestCode == RESULT_CANCELED) { 
      Toast.makeText(this, "Error, user cancelled the image capture", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(this, "Imagecapture failed.", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

/* Create a file Uri for saving an image */ 
private static Uri getOutputMediaFileUri (int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

/* Create a file to save an image */ 
private static File getOutputMediaFile(int type) { 

    //check if SD-Card is mounted 
    Boolean isMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 

    File mediaStorageDir = null; 

    if (isMounted) { 
     //create storage directory if does not exist 
     mediaStorageDir = new File (Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES), "IdeaGallery"); 

     if (! mediaStorageDir.exists()) { 
      if (! mediaStorageDir.mkdir()) { 
       Log.d("IdeaGallery", "failed to create"); 
       return null; 
      } 
     } 

    } else { 
     Log.d("IdeaGallery", "failed to create"); 
    } 

    //create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 

    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp 
     + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) 
{ // BEST QUALITY MATCH 

    //First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(path, options); 

    // Calculate inSampleSize, Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    options.inPreferredConfig = Bitmap.Config.RGB_565; 
    int inSampleSize = 1; 

    if (height > reqHeight) 
    { 
     inSampleSize = Math.round((float)height/(float)reqHeight); 
    } 
    int expectedWidth = width/inSampleSize; 

    if (expectedWidth > reqWidth) 
    { 
     inSampleSize = Math.round((float)width/(float)reqWidth); 
    } 

    options.inSampleSize = inSampleSize; 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 

    return BitmapFactory.decodeFile(path, options); 
} 

}