使用Intent将资产文件夹中的GIF图像发送到另一个应用程序

时间:2017-04-24 10:09:36

标签: android android-intent android-softkeyboard gif android-file

我们如何使用Intent将资产文件夹中存在的GIF图像发送到另一个应用程序?

我试过这个:

private File getEmojiFile(int position) {
    AssetManager assetManager = getApplicationContext().getAssets();
    File file = new File(getCacheDir(), mEmojiFileNames[position]);
    try {
        if (!file.createNewFile()) {
            //Emoji File already exists.
            return file;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    FileChannel in_chan = null, out_chan = null;
    try {
        AssetFileDescriptor in_afd = assetManager.openFd(mEmojiFileNames[position]);
        FileInputStream in_stream = in_afd.createInputStream();
        in_chan = in_stream.getChannel();

        FileOutputStream out_stream = new FileOutputStream(file);
        out_chan = out_stream.getChannel();
        in_chan.transferTo(in_afd.getStartOffset(), in_afd.getLength(), out_chan);
    } catch (IOException ioe) {
        Log.w("copyFileFromAssets", "Failed to copy file '" + mEmojiFileNames[position] + "' to external storage:" + ioe.toString());
    } finally {
        try {
            if (in_chan != null) {
                in_chan.close();
            }
            if (out_chan != null) {
                out_chan.close();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
    return file;
}

然后使用Intent将其发送到另一个应用程序:

            final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            EMOJI_IMAGE_TYPE emojiImageType = getImageType(position);
            intent.setType("image/gif"));
            intent.setPackage(getCurrentAppPackage(SoftKeyboard.this, getCurrentInputEditorInfo()));

            PackageManager packageManager = getPackageManager();
            if (intent.resolveActivity(packageManager) != null) {

                //Save emoji file because current input field supports GIF/PNG.
                File emojiFile = getEmojiFile(position);
                Uri photoURI = FileProvider.getUriForFile(SoftKeyboard.this, SoftKeyboard.this.getApplicationContext().getPackageName() + ".provider", emojiFile);
                intent.putExtra(Intent.EXTRA_STREAM, photoURI);

                dialog.dismiss();
                hideWindow();
                try {
                    startActivity(intent);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(SoftKeyboard.this,"This text field does not support "+
                       "GIF"+" insertion from the keyboard.",Toast.LENGTH_LONG).show();
            }

但是,此空白图像即将到来。这里尝试将图像发送到messenger应用程序。它接受了意图,但显示了空白的透明图像:enter image description here

1 个答案:

答案 0 :(得分:1)

场景:您在Drawable文件夹中有一个gif文件。 那么代码将是:`

private void shareDrawable(Context context,int resourceId,String fileName) {
    try {
        //create an temp file in app cache folder
        File outputFile = new File(context.getCacheDir(), fileName + ".gif");
        FileOutputStream outPutStream = new FileOutputStream(outputFile);

        //Saving the resource GIF into the outputFile:
        InputStream is = getResources().openRawResource(resourceId);
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int current = 0;
        while ((current = bis.read()) != -1) {
            baos.write(current);
        }
        FileOutputStream fos = new FileOutputStream(outputFile);
        fos.write(baos.toByteArray());

        //
        outPutStream.flush();
        outPutStream.close();
        outputFile.setReadable(true, false);

        //share file
        Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(outputFile));
        shareIntent.setType("image/gif");
        context.startActivity(shareIntent);
    }
    catch (Exception e) { Toast.makeText(context, "error", Toast.LENGTH_LONG);}
}