当前位置: 首页 > 知识库问答 >
问题:

Android studio-难以从应用程序资产中共享图像/音频/视频文件

梁丘宏硕
2023-03-14

很长一段时间以来,我一直试图从assets文件夹中为不同类型的文件创建一个跨应用程序共享意图,但始终存在一个问题。我提出了许多不同类型的解决方案,例如:

  • 尝试使用自定义内容提供商(此处或此处…)
  • 尝试将文件保存在本地存储器上(此处示例)
  • 和其他人,但由于它没有工作,我没有链接了

现在,这是我的工作解决方案,用于仅将音频文件共享给WhatsApp和Messenger,所有其他应用程序都失败了)。

我在应用程序存储上创建新文件的功能:

public String getNewPathFromSbElem(SbElem sbElem, String fileName) {
    AssetManager assetManager = getAssets();
    String path = sbElem.soundPath;
    String newName = fileName;
    String newPath = getExternalFilesDir(null).getAbsolutePath() + File.separator + newName;
    InputStream in = null;
    OutputStream out = null;
    File outFile;

    File deleteFile = new File(newPath);
    if(deleteFile.exists()) {
        deleteFile.delete();
    }

    try {
        in = assetManager.open(path);
        outFile = new File(getExternalFilesDir(null), newName);
        out = new FileOutputStream(outFile);
        copyFile(in, out);
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        if (out != null) {
            try {
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    return newPath;
}

在whatsapp或messenger上分享我的两个功能:

public void shareOnWhatsApp(SbElem sbElem) {
    final String newPath = getNewPathFromSbElem(sbElem, "_share_temp_file.mp3");
    Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
    whatsappIntent.setPackage("com.whatsapp");
    whatsappIntent.setType("audio/mp3");
    whatsappIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(newPath));
    whatsappIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    try {
        startActivity(whatsappIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        Log.d("error", "WhatsApp not installed");
    }
}

public void shareOnMessenger (SbElem sbElem) {
    final String newPath = getNewPathFromSbElem(sbElem, "_share_temp_file.mp3");
    final File newFile = new File(newPath);
    final Uri newUri = FileProvider.getUriForFile(this, getString(R.string.file_provider_authority), newFile);
    final Integer SHARE_TO_MESSENGER_REQUEST_CODE = 1;

    String mimeType = "audio/*";
    ShareToMessengerParams shareToMessengerParams = ShareToMessengerParams.newBuilder(newUri, mimeType).build();
    MessengerUtils.shareToMessenger(this, SHARE_TO_MESSENGER_REQUEST_CODE, shareToMessengerParams);
}

问题是,我希望能够从我的资产文件夹a共享。mp3,a。jpg,a。png、gmail、whatsapp、slack或任何支持此扩展的应用程序。。。

因此,几乎所有关于共享资产的在线1000个问题/文章都是通过使用自定义内容提供商来回答的,我尝试了以下共享功能:

public void shareBasic () {
    // I added the test.jpg in the root of my asset folder
    // Tried with content / file / 2 or 3 '/', with package name and with assets / ...
    Uri theUri = Uri.parse("content:///com.MY_PACKAGE_NAME/test.jpg");
    //Uri theUri = Uri.parse("content:///assets/test.jpg");
    //Uri theUri = Uri.parse("file:///com.MY_PACKAGE_NAME/test.jpg");
    //Uri theUri = Uri.parse("file:///asset.jpg");
    Intent theIntent = new Intent(Intent.ACTION_SEND);
    // Tried with jpeg / png / jpg ...
    theIntent.setType("image/*");
    theIntent.putExtra(Intent.EXTRA_STREAM, theUri);
    theIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(theIntent);
}

这是我的Android清单:

    <provider
        android:name="MY_PACKAGE_NAME.MyContentProvider"
        android:authorities="MY_PACKAGE_NAME"
        android:grantUriPermissions="true"
        android:exported="true" />

和文件提供者(每个教程几乎相同)

public class MyContentProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )
    {
        // TODO: Implement this method
        return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
        AssetManager am = getContext().getAssets();
        String fileName = uri.getLastPathSegment();
        if(fileName == null)
            throw new FileNotFoundException();
        AssetFileDescriptor fileDescriptor = null;
        try {
            fileDescriptor = am.openFd(fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileDescriptor;
    }
}

我想我犯了很大的错误,因为共享资产文件夹中的文件不应该如此困难,有什么想法吗?

共有1个答案

沈树
2023-03-14

对于您的内容提供者解决方案:

>

您需要让您的getType()函数返回实际的MIME类型

您的意图需要使用具体的MIME类型,而不是通配符

请参阅此旧示例项目进行演示。

 类似资料:
  • 我正在尝试制作一个用于共享音频文件的按钮。这不起作用。首先,我试图直接从原始文件夹发送文件,而不将其复制到手机卡上。这并没有解决我的问题。我尝试的第二件事是将文件保存到手机上,然后共享。将文件保存到手机的部分现在可以工作了,但当我尝试将音频文件共享到其他设备时,所有兼容的应用程序(Whatsapp、Gmail等)都崩溃了。 这是我的代码: 顺便说一下,音频文件是一个。ogg文件。我希望这些应用程序

  • 看来我有bug了。至少我认为这是一个错误。我编写了一种Soundboard并想添加与他人共享声音的功能。我要分享的代码如下: 我的问题是,这是可行的,但只适用于一些应用程序。例如,当我与WhatsApp或DropBox共享音频时,它似乎工作得很好,但当我尝试使用Google Drive或Bluetooth进行相同操作时,似乎出现了一些错误。请注意,音频的文件类型为WAV。我还确保我有权限写入外部存

  • 我想从我的应用程序在不同的社交应用程序中共享音频文件。我正在使用以下代码来共享音频。它适用于Whatsapp,但不适用于共享。共享应用程序打开但无法检索文件并显示“不支持发送此类内容”。该文件为“mp3”格式。我可以使用android通用共享选项从文件管理器共享文件,然后选择共享。

  • 正在尝试从图像(1080p.png)音乐(320kbmp3)为youtube制作视频。 但转化是缓慢的。有什么想法吗,它是如何使优化的<代码>E:\U测试

  • 我编写了代码将几个音频文件与1个图像组合成WebM视频。(audio1与默认jpg结合,audio2与默认jpg结合等)。 问题是,在此之后,视频长度比音频长度长25秒(因此音频在视频结束前缩短25秒)。 有没有办法在音频的同时停止视频?这是我使用的代码(我启动一个BAT命令文件)

  • 我用ffmpeg库为android转换了一个图像到mp4视频,但这需要太长时间,我想避免第三方库,如果可能的话。请帮我解决我的问题。 谢谢你。