Java .\key.p12:打开失败:enoint(没有这样的文件或目录)
在我的android应用程序中,我正在访问谷歌云存储。我已生成私钥xxxxxxx key.p12。我已将密钥文件放入资产文件夹。但在运行项目时,它不会打开key.p12文件。我试着把它放在资产文件夹之外,仍然没有结果Java .\key.p12:打开失败:enoint(没有这样的文件或目录),java,android,google-cloud-storage,assets,google-cloud-platform,Java,Android,Google Cloud Storage,Assets,Google Cloud Platform,在我的android应用程序中,我正在访问谷歌云存储。我已生成私钥xxxxxxx key.p12。我已将密钥文件放入资产文件夹。但在运行项目时,它不会打开key.p12文件。我试着把它放在资产文件夹之外,仍然没有结果 httpTransport = AndroidHttp.newCompatibleTransport(); AssetManager am = getAssets(); InputStream inputStream =
httpTransport = AndroidHttp.newCompatibleTransport();
AssetManager am = getAssets();
InputStream inputStream = am.open("xxxxxxxxxxKey.p12");
File file = createFileFromInputStream(inputStream);
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com")
.setServiceAccountScopes(Collections.singleton(STORAGE_SCOPE))
.setServiceAccountPrivateKeyFromP12File(file).build();
createFileFromInputStream()
我在java项目中也做过同样的事情。有什么不同,是因为android吗?或者文件位置的路径不正确?经过一番努力,我得到了答案,非常感谢您的支持。竖起大拇指 可以使用AssetManager检索文件,我们也可以将其作为原始资源获取
private File createFileFromInputStream(InputStream inputStream) {
String path = "";
File file = new File(Environment.getExternalStorageDirectory(),
"KeyHolder/KeyFile/");
if (!file.exists()) {
if (!file.mkdirs())
Log.d("KeyHolder", "Folder not created");
else
Log.d("KeyHolder", "Folder created");
} else
Log.d("KeyHolder", "Folder present");
path = file.getAbsolutePath();
try {
File f = new File(path+"/MyKey");
OutputStream outputStream = new FileOutputStream(f);
byte buffer[] = new byte[1024];
int length = 0;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
return f;
} catch (IOException e) {
// Logging exception
e.printStackTrace();
}
return null;
}
使用AssetManager
AssetManager am = getAssets();
InputStream inputStream = am.open("xxxxxxxxxxKey.p12");
File file = createFileFromInputStream(inputStream);
作为原始资源,将文件放在res目录中的原始文件夹中
InputStream ins = getResources().openRawResource(R.raw.keyfile);
File file = createFileFromInputStream(ins);
在编写输出文件时,您必须指定密钥文件实际所属的位置,在我使用android的情况下,我在文件夹KeyHolder/keyfile
private File createFileFromInputStream(InputStream inputStream) {
String path = "";
File file = new File(Environment.getExternalStorageDirectory(),
"KeyHolder/KeyFile/");
if (!file.exists()) {
if (!file.mkdirs())
Log.d("KeyHolder", "Folder not created");
else
Log.d("KeyHolder", "Folder created");
} else
Log.d("KeyHolder", "Folder present");
path = file.getAbsolutePath();
try {
File f = new File(path+"/MyKey");
OutputStream outputStream = new FileOutputStream(f);
byte buffer[] = new byte[1024];
int length = 0;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
return f;
} catch (IOException e) {
// Logging exception
e.printStackTrace();
}
return null;
}
就这样 您是否尝试过用Unix路径分隔符替换Windows路径分隔符
\
?您的意思是“//key.p12”?不,就像/key.p12
一样简单。只需要双反斜杠,因为这是java中的转义字符,所以需要转义转义字符;)结果是相同的,eOnt异常。为什么不使用AssetManager读取文件?或者,如果不想使用AssetManager,请将其放在原始文件夹中?