2017-06-22 132 views
0

我想共享一个mp3文件到whatsapp。 我发现了堆栈溢出this question,但接受的答案不适用于我。如果我尝试使用WhatsApp的,它说共享“共享失败,请再试一次”:a如何分享mp3文件到whatsapp? (Android Studio)

    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")); 



     } 



     }); 
    } 


} 

当然我在清单写这条线:

<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) 

回答

0

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

您的前两个样本无法使用,因为它们与raw资源无关。他们从一个可能不存在的目录共享一个不存在的文件。

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

如果这个代码将在您的前两个代码片断去,ContextID可以this更换。如果您尝试共享res/raw/sound.mp3,则ResourceIDR.raw.sound

+0

我编辑我的问题。我删除了“ContextID”并将“ResourceID”更改为“R.raw.sound”。但也在这里,我收到错误消息“共享失败,请再试一次” – OverflowStacker

+0

@OverflowStacker:用'Uri替换'Uri.parse(Environment.getExternalStorageDirectory()。toString()+“/sound.mp3”)'''。 fromFile(新文件(环境。getExternalStorageDirectory()。toString(),“sound.mp3”))'。另外,不要在没有记录日志的情况下捕获异常,就好像你在磁盘I/O中崩溃(例如,你没有权限),你不会发现它。 – CommonsWare

+0

我编辑了我的问题。它仍然没有工作,但我发布了我的LogCat – OverflowStacker

1

Android 6.0棉花糖(API 23)或更高版本。如果是这样的话,你mustimplement runtime permissions

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

文件FILES_PATH =新的文件(

Environment.getExternalStorageDirectory(),

“的Android /数据/ COM .examples(your package)/ files“);

文件sharefile =新的文件(

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(); 

        } 
+0

我在我编辑的问题中插入了整个MainActivity.java。那是我的做法吗?因为它仍然在说我“共享失败,请重试” – OverflowStacker

+0

检查编辑的答案 –

+0

无法解析方法“putExtra”。我在我编辑的问题中发布了新的MainActivity。 – OverflowStacker