1 year ago

#265506

test-img

Dúver Cruz

Take and save photo to network folder Android

I spend +50h in this and I cant find a solution, need some help. I'm trying to take a photo and save it on NAS folder. I actually can connect to NAS from Android and create a folder but cant get the photo from camera to copy it on NAS.

Method to open the camera.

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getApplication().getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;

        try {
            photoFile = createImageFile();

            if (photoFile != null) {

                 photoURI = FileProvider.getUriForFile(getApplicationContext(),
                        "p.cristian.sealed.provider",
                        photoFile);

                 deleteFile(photoFile.getName());

               takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
               // takePictureIntent.putExtra("picname", photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
                photoFile.deleteOnExit();
            }
        } catch (Exception ex) {
            Log.e("ERROR", ex.getMessage());
        }
    }
}


private File createImageFile() throws IOException {
    String imageFileName = "IMG";
    File storageDir = 
    getApplication().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = null;
    
    image = File.createTempFile(
            imageFileName,
            ".jpg",
            storageDir
    );
    
    currentPhotoPath = image.getAbsolutePath();

    return image;
}

private void algo(String nombreCarpetaNueva, String rutaImagenACopiar){

    SmbFileOutputStream out = null;
    try {
        NtlmPasswordAuthenticator auth = new NtlmPasswordAuthenticator("MyDomain", 
        "MyUser", "MyPass");
        SmbFile smbFile = new SmbFile("smb://" + auth.getUserDomain() + ";" + 
auth.getUsername() + ":" + auth.getPassword() + "@" + "192.168.1.50/NAS/Software/" + 
nombreCarpetaNueva);

        if (!smbFile.exists()) {
            smbFile.mkdirs();
        }

        smbFile.connect();

        SmbFile nuevoArchivo = new SmbFile(smbFile + "/" + rutaImagenACopiar);

        int cursor;

        jcifs.smb1.smb1.SmbFileInputStream in = new 
jcifs.smb1.smb1.SmbFileInputStream(nuevoArchivo);
        out = new SmbFileOutputStream(nuevoArchivo);

        while ((cursor = in.read()) != -1) {
            out.write(cursor);
        }

        out.flush();
        out.close();
    }
    catch (Exception e) {

        String msg = "ERROR: " + e.getLocalizedMessage();
        Log.i("asdf:",msg);
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras(); // ALWAYS NULL
        String fileName = extras.getString("picname"); //NOT WORKING IS NULL

        algo("R_folder", fileName); //this just create the folder but never copy the image.
       //algo("R_folder", fileName+".jpg");           
    }
}

MANIFEST

 <uses-permission
        android:name="android.permission.AUTHENTICATE_ACCOUNTS"
        android:maxSdkVersion="22" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>

    <uses-feature android:name="android.hardware.camera" android:required="true" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
...
    <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="p.cristian.sealed.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
    </provider>

FILE_PATHS FILE

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

I tested a lot of stackoverflow answers but never got the correct one in my case :( Some site answers tested from:

Android Camera Intent: how to get full sized photo?

Get file path of image on Android

How to get path of picture in onActivityresult (Intent data is null)

Android doc, and much more sites..

EDIT - GOT THE SOLUTION

private void algo(String rutaImagenACopiar){

    SmbFileOutputStream out = null;
    try {
        NtlmPasswordAuthenticator auth = new NtlmPasswordAuthenticator("MyDomain", "myUser", "MyPass");

        File file = new File(rutaImagenACopiar);
        String fileName = file.getName();
        SmbFile smbFile = new SmbFile("smb://" + auth.getUserDomain() + ";" + auth.getUsername() + ":" + auth.getPassword() + "@" + "192.168.1.50/NAS/Software/" + fileName);

        if (!smbFile.exists()) {
            smbFile.createNewFile();
           //smbFile.mkdirs();
        }
        smbFile.connect();

        InputStream inNew = new FileInputStream(file);
        SmbFileOutputStream outNew = new SmbFileOutputStream(smbFile);

        byte[] buf = new byte[8192];
        int len;
        while ((len = inNew.read(buf)) > 0) {
            outNew.write(buf, 0, len);
        }
        inNew.close();
        outNew.close();
}

Now I just need to get the correct buffer size

java

android

smb

jcifs

0 Answers

Your Answer

Accepted video resources