Appem
Appem

Reputation: 303

How can I get file path on raw resources in Android Studio?

I have been using this tutorial to make some face detections on picture. The problem is when I getting the file path that used on java

String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
CascadeClassifier classifier = new CascadeClassifier(xmlFile);

How can I translate on android studio. I try put my lbpcascade_frontalface.xml on raw resources. CascadeClassifier is a class that opencv library provided. The only problem is they only loaded string path (on xmlfile). this is my code.

String pathtoRes = getRawPathAtempt2(context);
CascadeClassifier cascadeClassifier = new CascadeClassifier();
cascadeClassifier.load(pathtoRes);

I translated to some method like this.

  public String getRawPathAtempt2(Context context) {
    return "android.resource://" + context.getPackageName() + "/raw/" + "lbpcascade_frontalface.xml";
}

enter image description here

I get the asertions error by opencv that tell me the file is null. Thats mean I had been wrong when I used file path on my method. how can I get file path on raw resources? help me please I have been stuck for several days now

Upvotes: 6

Views: 22592

Answers (4)

Franklin Das J V
Franklin Das J V

Reputation: 1

We can use this Alternative method for finding the path of Files in Raw Folder.

InputStream inputStreamdat=getResources().openRawResource(R.raw.face_landmark_model);
File model=getDir("model", Context.MODE_PRIVATE);
File modelFile=new 
File(model,"face_landmark_model.dat");        
FileOutputStream os1 = new 
FileOutputStream(modelFile);
byte[] buffer1 = new byte[4096];
int bytesRead1;
        while ((bytesRead1=inputStreamdat.read(buffer1))!=-1) {
            os1.write(buffer1, 0, bytesRead1);
        }
        inputStreamdat.close();
        os1.close();

You Can Use
modelFile.getAbsolutePath()); For getting the Path

Upvotes: 0

Yogesh Nikam Patil
Yogesh Nikam Patil

Reputation: 1280

Uri video = Uri.parse("android.resource://com.test.test/raw/filename");

Using this you can access the file in raw folder, if you want to access the file in asset folder use this URL...

file:///android_asset/filename

Make sure you don't add the extension to the filename. E.g. "/movie" not "/movie.mp4".

Refer to this link:

Raw folder url path?

Upvotes: 1

Appem
Appem

Reputation: 303

This is how i solved the problem with @CommonWare Answer

i'm using input stream to get file

is = context.getResources().openRawResource(R.raw.lbpcascade_frontalface);

so make the file will be opened and i will make a point to the File class

 File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE);
 mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml"); 

and then i make a search to the path file using getAbsolutePath like this

 cascadeClassifier.load(mCascadeFile.getAbsolutePath());

take a look at my full code

try {
        is = context.getResources().openRawResource(R.raw.lbpcascade_frontalface);
        File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE);
        mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");

        os = new FileOutputStream(mCascadeFile);

        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }

        is.close();
        os.close();

        cascadeClassifier.load(mCascadeFile.getAbsolutePath());


    } catch (IOException e) {
        Log.i(TAG, "face cascade not found");
    }

Upvotes: 4

CommonsWare
CommonsWare

Reputation: 1006614

how can i get file path on raw resources?

You can't. There is no path. It is a file on your development machine. It is not a file on the device. Instead, it is an entry in the APK file that is your app on the device.

If your library supports an InputStream instead of a filesystem path, getResources().openRawResource() on a Context to get an InputStream on your raw resource.

Upvotes: 8

Related Questions