【问题标题】:aHow can I share a mp3 file to whatsapp? (Android Studio)如何将 mp3 文件分享到 whatsapp? (安卓工作室)
【发布时间】:2017-06-23 19:55:56
【问题描述】:

我想分享一个 mp3 文件到 whatsapp。 我在 Stack Overflow 上找到了this question,但接受的答案对我不起作用。如果我尝试与 whatsapp 共享它,它会显示“共享失败,请重试”:

                    File dest = Environment.getExternalStorageDirectory();
                InputStream in = getResources().openRawResource(R.raw.sound);

                try
                {
                    OutputStream out = new FileOutputStream(new File(dest, "sound.mp3"));
                    byte[] buf = new byte[1024];
                    int len;
                    while ( (len = in.read(buf, 0, buf.length)) != -1)
                    {
                        out.write(buf, 0, len);
                    }
                    in.close();
                    out.close();
                }
                catch (Exception e) {
e.printStackTrace();}

                Intent share = new Intent(Intent.ACTION_SEND);
                share.putExtra(Intent.EXTRA_STREAM, Uri.parse(Environment.getExternalStorageDirectory().toString() + "/sound.mp3"));
                share.setType("audio/mp3");
                startActivity(Intent.createChooser(share, "Shared"));

这是完整的 MainActivity.java:

    package com.example.aaron.sharetest;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {

    Button shareBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final File FILES_PATH = new File(Environment.getExternalStorageDirectory(), "Android/data/com.example.aaron.sharetest/files");

        File sharefile= new File(FILES_PATH, "sound.mp3") ;
        putExtra(Intent.EXTRA_STREAM, Uri.fromFile(sharefile));


        shareBtn = (Button)findViewById(R.id.shareBtn);

        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                1);

        shareBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {




                if (Environment.MEDIA_MOUNTED.equals(

                        Environment.getExternalStorageState())) {

                    if (!FILES_PATH.mkdirs()) {

                        Log.w("error", "Could not create " + FILES_PATH);

                    }

                } else {

                    Toast.makeText(MainActivity.this, "error", Toast.LENGTH_LONG).show();

                    finish();

                }


                File dest = Environment.getExternalStorageDirectory();
                InputStream in = getResources().openRawResource(R.raw.bibikurz);

                try
                {
                    OutputStream out = new FileOutputStream(new File(dest, "sound.mp3"));
                    byte[] buf = new byte[1024];
                    int len;
                    while ( (len = in.read(buf, 0, buf.length)) != -1)
                    {
                        out.write(buf, 0, len);
                    }
                    in.close();
                    out.close();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }

                Intent share = new Intent(Intent.ACTION_SEND);
                share.putExtra(Intent.EXTRA_STREAM, Uri.parse(Environment.getExternalStorageDirectory().toString() + "/sound.mp3"));
                share.setType("audio/mp3");
                startActivity(Intent.createChooser(share, "Shared"));



        }



        });
    }


}

当然,我在 Manifest 中写了这一行:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如何将 mp3 文件分享到 whatsapp 等?

我尝试了这么多公认的答案,但没有一个对我有用。

这是我在 LogCat 中得到的:

06-23 02:41:17.589 23924-23924/? W/Bundle: Key android.intent.extra.STREAM expected ArrayList but value was a android.net.Uri$StringUri.  The default value <null> was returned.
06-23 02:41:17.659 23924-23924/? W/Bundle: Attempt to cast generated internal exception:
                                           java.lang.ClassCastException: android.net.Uri$StringUri cannot be cast to java.util.ArrayList
                                               at android.os.Bundle.getParcelableArrayList(Bundle.java:838)
                                               at android.content.Intent.getParcelableArrayListExtra(Intent.java:5481)
                                               at com.whatsapp.ContactPicker.k(ContactPicker.java:623)
                                               at com.whatsapp.ContactPicker.onCreate(ContactPicker.java:338)
                                               at android.app.Activity.performCreate(Activity.java:6367)
                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2404)
                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2511)
                                               at android.app.ActivityThread.access$900(ActivityThread.java:165)
                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1375)
                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                               at android.os.Looper.loop(Looper.java:150)
                                               at android.app.ActivityThread.main(ActivityThread.java:5621)
                                               at java.lang.reflect.Method.invoke(Native Method)
                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

【问题讨论】:

    标签: java android mp3 share whatsapp


    【解决方案1】:

    Android 6.0 Marshmallow (API 23) 或更高版本。如果是这种情况,您必须实现runtime permissions

    使用文件路径并检查内存卡

    文件 FILES_PATH = 新文件(

            Environment.getExternalStorageDirectory(),

            “Android/data/com.examples(your package)/files”);

        文件共享文件=新文件(

                FILES_PATH,

                "demo.mp3") ;

    putExtra(Intent.EXTRA_STREAM, Uri.fromFile(sharefile))

    @Override
    
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
    
    
            if (Environment.MEDIA_MOUNTED.equals(
    
                Environment.getExternalStorageState())) {
    
                if (!FILES_PATH.mkdirs()) {
    
                    Log.w(TAG, "Could not create " + FILES_PATH);
    
                }
    
            } else {
    
                Toast.makeText(this, R.string.need_external_storage, Toast.LENGTH_LONG).show();
    
                finish();
    
            }
    

    【讨论】:

    • 我在我编辑的问题中发布了整个 MainActivity.java。我是这样做的吗?因为它还在说我“分享失败,请重试”
    • 无法解析方法“putExtra”。我在我编辑的问题中发布了新的整个 MainActivity。
    【解决方案2】:

    我的“sound.mp3”文件位于原始文件夹中。

    您的前两个示例将不起作用,因为它们与 raw 资源无关。他们从一个可能也不存在的目录共享一个不存在的文件。

    但是这里我不知道“ContextID”或“ResouceID”是什么。

    如果这段代码在你的前两个代码 sn-ps 的位置,ContextID 可以替换为this。如果你想分享res/raw/sound.mp3,那么ResourceID就是R.raw.sound

    【讨论】:

    • 我编辑了我的问题。我删除了“ContextID”并将“ResourceID”更改为“R.raw.sound”。但也在这里我收到错误消息“共享失败,请重试”
    • @OverflowStacker:将Uri.parse(Environment.getExternalStorageDirectory().toString() + "/sound.mp3") 替换为Uri.fromFile(new File(Environment.getExternalStorageDirectory().toString(), "sound.mp3"))。此外,永远不要在没有记录的情况下 catch 出现异常,就好像您在磁盘 I/O 中崩溃(例如,您缺乏权限),您没有发现它。
    • 我编辑了我的问题。它仍然无法正常工作,但我发布了我的 LogCat
    • @OverflowStacker:你需要持有WRITE_EXTERNAL_STORAGE 权限才能写到你想写的地方。而这反过来又要求你实现runtime permissions
    • 我编辑了我的问题并发布了我的整个 MainActivity.java,我是这样做的吗?因为它仍然无法正常工作。但现在我得到了另一个 LogCat 条目,我也在我编辑的问题中发布了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2016-06-27
    • 2018-01-29
    • 2013-07-08
    • 2017-04-17
    • 2014-04-30
    相关资源
    最近更新 更多