2017-06-22 133 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