如何在Android Studio中获取原始资源上的文件路径?

时间:2019-04-09 10:46:06

标签: android file

我一直在使用this教程对图片进行面部检测。问题是当我获取在Java上使用的文件路径时

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

如何在android studio上翻译。我尝试将lbpcascade_frontalface.xml放在原始资源上。 CascadeClassifier是opencv库提供的类。唯一的问题是它们仅加载了字符串路径(在xmlfile上)。 这是我的代码。

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

我翻译成这样的方法。

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

enter image description here

我通过opencv收到断言错误,告诉我文件为空。那意味着当我在方法中使用文件路径时,我错了。如何获取原始资源上的文件路径?帮帮我,请问我已经被困了好几天了

4 个答案:

答案 0 :(得分:2)

  

如何获取原始资源上的文件路径?

不能。没有路。它是开发计算机上的文件。它不是设备上的文件。相反,它是APK文件中的一项,即您在设备上的应用。

如果您的库支持InputStream而不是文件系统路径,请在getResources().openRawResource()上使用Context,以在原始资源上获取InputStream

答案 1 :(得分:0)

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

使用它可以访问原始文件夹中的文件,如果要访问资产文件夹中的文件,请使用此URL ...

file:///android_asset/filename

确保没有将扩展名添加到文件名中。例如。 “ / movie”而不是“ /movie.mp4”。

请参阅此链接:

Raw folder url path?

答案 2 :(得分:0)

这就是我用@CommonWare Answer解决问题的方法

我正在使用输入流获取文件

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

因此,将打开文件,然后指向File类

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

然后我像这样使用getAbsolutePath搜索路径文件

 cascadeClassifier.load(mCascadeFile.getAbsolutePath());

看看我的完整代码

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");
    }

答案 3 :(得分:0)

我们可以使用这种替代方法来查找原始文件夹中文件的路径。

/*Remove struct padding*/
#pragma pack(push, 1)
typedef struct
{
   int8_t a;
   int8_t b;
   int8_t c;
   int8_t d;
} data;
/*Recover struct padding, some structs from other libraries malfunction from not using struct pudding.*/
#pragma pack(pop)

int main()
{
   /*Define a clean data structure*/
   data tmp = { 0x00, 0x00, 0x00, 0x00 };

   ((int8_t *)&tmp)[0] = 0x01; /*data.a = 0x01*/
   ((int8_t *)&tmp)[1] = 0x03; /*data.b = 0x03*/
   ((int8_t *)&tmp)[2] = 0x05; /*data.c = 0x05*/
   ((int8_t *)&tmp)[3] = 0x07; /*data.d = 0x07*/

   return 0;
}

你可以使用
modelFile.getAbsolutePath());获取路径