如何将GIF图像复制到设备内存或在drawable中获取正确的GIF路径

时间:2016-10-14 07:14:31

标签: android gif android-drawable

我有一个任务,我想获得可绘制的GIF图像路径,但我没有得到正确的路径,我尝试在代码下设置路径。

String inputPath = Environment.getExternalStorageDirectory()+ "/temp.gif";

但它没有工作它不给我正确的图像,但当我试图从SD卡获取路径与下面的代码

Bitmap bm = BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher);
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File file = new File(extStorageDirectory, "ic_launcher.PNG");
outStream = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
outStream.flush();
outStream.close();

它正在发挥作用。

所以现在我试图从SD卡或内存中存储来自drawable或资产的gif图像。我发现下面的代码将PNG或JPEG复制到SD卡。

{{1}}

但没有办法复制GIF图像。 欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

确实,你不会从这样的资源ID获得路径。相反,您可以从这样的资源中获取InputStream并使用该流来读取内容并复制到例如真实文件或其他任何内容。

InputStream is = getResources().openRawResource(R.drawable.temp);

文件的类型无关紧要。只要你有这个复制文件'工作你可以丢弃复制jpg和png的代码,因为它使用中间的Bitmap,这是一个坏主意,将改变文件内容,你最终得到一个不同的文件-size - 。

答案 1 :(得分:0)

我在下面制作了获取图像路径的方法,并且它的工作正常。

int resId = R.drawable.temp;
public String getFilePath(int resId){
   // AssetManager assetManager = getAssets();
    String fileName = "emp.gif";
    InputStream in = null;
    OutputStream out = null;
    File outFile = null;
    try {
        //in = assetManager.open(fileName);
        in = getResources().openRawResource(resId);
        outFile = new File(getExternalFilesDir(null), fileName);
        out = new FileOutputStream(outFile);
        copyFile(in, out);
    } catch(IOException e) {
        Log.e("tag", "Failed to copy asset file: " + fileName, e);
    }
    finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                // NOOP
            }
        }
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                // NOOP
            }
        }
    }

    return outFile.getAbsolutePath();
}

private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
    }
}