Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Intent将资产文件夹中的GIF图像发送到另一个应用程序_Android_Android Intent_Android Softkeyboard_Gif_Android File - Fatal编程技术网

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

Android 使用Intent将资产文件夹中的GIF图像发送到另一个应用程序,android,android-intent,android-softkeyboard,gif,android-file,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.cr

如何使用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应用程序。它接受了意图,但显示了空白的透明图像:

场景:您在可绘制文件夹中有一个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);}
}

图像是如何显示的?Androids ImageView和BitmapFactory本身不支持gif图像。您可以尝试将图像uri作为
数据而不是额外的。这应该是首选,但这取决于接收器应用程序。我使用Glide在ImageView中显示GIF。尝试将URI作为数据。但是,同样的问题也出现了。您使用了getCacheDir(),它是仅用于应用程序的内部私有存储。其他应用程序无法访问。尝试getExternalCacheDir()。