分享功能几乎是每个App必备的功能,我这次测试分享的时候是基于微信的,可能不同的app,效果会不一样。这次试验测试了文字、图片、音频、视频的分享。功能都可以实现的。下面给出源代码。
第一步:ShareActivity.java源代码
package com.figo.study.activity;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.figo.study.R;
import com.figo.study.utils.CommonUtil;
import com.figo.study.utils.FileUtils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class ShareActivity extends Activity {
String tag="ShareActivity";
Button mBtnShare;
TextView mtxtShare;
ImageView mImgShare;
private String mDirectoryName = "meme";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_share);
mtxtShare = (TextView) findViewById(R.id.txt_share);
mImgShare = (ImageView) findViewById(R.id.img_share);
mBtnShare = (Button) findViewById(R.id.btn_share);
mBtnShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String subject = "share test";
String content =mtxtShare.getText().toString();
// Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.ab);
//经测试写入data/data/文件夹下面的数据因为权限不足,无法分享出去
// String imgPath= FileUtils.saveBitmapToData(ShareActivity.this, mDirectoryName, "test.jpg", bitmap);
//写入sdcard可以进行分享
// String imgPath= FileUtils.saveBitmapToSdCard(ShareActivity.this,mDirectoryName,"test.jpg",bitmap);
//分享纯文本
// shareText(subject, content);
//分享文本+图片
// shareTextAndImage(subject, content,imgPath);
//分享音视频
shareVideo(subject,content,readRawToFile());
}
});
}
//从raw文件夹读写文件
private String readRawToFile()
{
String filePath="";
Resources resources=ShareActivity.this.getResources();
InputStream is=null;
try{
// is=resources.openRawResource(R.raw.excuseme);
// filePath=FileUtils.inputStreamToFile(is,mDirectoryName,"excuteme.mp3");
is=resources.openRawResource(R.raw.fish);
filePath=FileUtils.inputStreamToFile(is,mDirectoryName,"test.mp4");
}
catch(IOException e)
{
Log.e(tag, "write file",e);
}
return filePath;
}
//分享文字
private void shareText(String sbuject, String content) {
try {
Intent intent = new Intent(Intent.ACTION_SEND); // 分享发送的数据类型
intent.setType("text/plain"); // 分享发送的数据类型
intent.putExtra(Intent.EXTRA_SUBJECT, sbuject); // 分享的主题
intent.putExtra(Intent.EXTRA_TEXT, content); // 分享的内容
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "Share"));// 目标应用选择对话框的标题
} catch (Exception e) {
CommonUtil.printStackTrace(e);
}
}
//分享图片+文字
private void shareTextAndImage(String sbuject, String content, String imgPath) {
try {
Intent intent = new Intent(Intent.ACTION_SEND); // 分享发送的数据类型
File f = new File(imgPath);
//imgPath只能存在sdcard中的,如果是data/data/packagename/下面的经测试无法分享,
// 也许data文件夹下,需要root的手机才有权限读取
if (f != null && f.exists() && f.isFile()) {
Uri parse = Uri.fromFile(f);
intent.putExtra(Intent.EXTRA_STREAM, parse);
}
// intent.setType("image/* "); // 分享发送的数据类型
intent.setType("image/*;text/plain"); // 分号分割表示可以同时分享发送的数据类型图片+文字
intent.putExtra(Intent.EXTRA_SUBJECT, sbuject); // 分享的主题
intent.putExtra(Intent.EXTRA_TEXT, content); // 分享的内容
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "Share"));// 目标应用选择对话框的标题
} catch (Exception e) {
CommonUtil.printStackTrace(e);
}
}
//分享视频,音频,文字
private void shareVideo(String sbuject, String content, String videoPath) {
try {
Intent intent = new Intent(Intent.ACTION_SEND); // 分享发送的数据类型
File f = new File(videoPath);
//imgPath只能存在sdcard中的,如果是data/data/packagename/下面的经测试无法分享,
// 也许data文件夹下,需要root的手机才有权限读取
if (f != null && f.exists() && f.isFile()) {
Uri parse = Uri.fromFile(f);
intent.putExtra(Intent.EXTRA_STREAM, parse);
}
// intent.setType("text/plain;audio/*"); // 分享发送的数据类型音频+文字,微信测试,识别不出音频
intent.setType("text/plain;video/*"); // 微信测试,这样写仅支持视频
// intent.setType("text/plain"); // 微信测试,这样写支持音频、视频+文字
intent.putExtra(Intent.EXTRA_SUBJECT, sbuject); // 分享的主题
intent.putExtra(Intent.EXTRA_TEXT, content); // 分享的内容
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "Share"));// 目标应用选择对话框的标题
} catch (Exception e) {
CommonUtil.printStackTrace(e);
}
}
}
package com.figo.study.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import com.figo.study.model.MemePackage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
/**
* 文件操作相关
*/
public class FileUtils {
//经测试以下两种方法获取到的路径是一样的
// private static String mSdRootPath = Environment.getExternalStorageDirectory().getPath();
private static String mSdRootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
private static String mDataRootPath = null;
private final static String FOLDER_NAME = "/study";
private final static String mDirectoryName = "study";
private final static String mMemeDirPath = "meme";
public FileUtils(Context context) {
mDataRootPath = context.getCacheDir().getPath();
}
public static String getStorageDirectory(String directoryName) {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ?
mSdRootPath + File.separator + directoryName : mDataRootPath + File.separator + FOLDER_NAME;
}
public static String getStorageDirectory() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ?
mSdRootPath + FOLDER_NAME : mDataRootPath + FOLDER_NAME;
}
public static String getPackageLocalPath(Context context, String directoryName) {
File dir = context.getDir(directoryName, Context.MODE_PRIVATE);
return dir.getAbsolutePath();
}
public static String getPackageLocalPath(Context context) {
File dir = context.getDir(mDirectoryName, Context.MODE_PRIVATE);
return dir.getAbsolutePath();
}
/**
* 保存到包名下 路径:/data/data/com.figo.study/app_mp3/hear.mp3
*
* @param context
* @param fileName
* @param bitmap
*/
public static String saveBitmapToData(Context context, String directoryName, String fileName, Bitmap bitmap) {
String filePath = "";
try {
File directory = new File(getPackageLocalPath(context, directoryName));
if (directory.exists()) {
Log.d("fileUtils", "" + directory.isDirectory());
}
//data文件夹权限比较高,一般是无法直接创建文件到data/目录下的
// directory=new File(Environment.getDataDirectory(),"swiftime");
if (!directory.exists()) {
directory.mkdirs();//没有目录先创建目录
}
filePath = directory.getPath() + File.separator + fileName;
File file = new File(filePath);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
return filePath;
}
/**
* 保存到包名下 路径:/data/data/com.figo.study/app_mp3/hear.mp3
*
* @param context
* @param fileName
* @param bitmap
*/
public static void saveBitmapToData(Context context, String fileName, Bitmap bitmap) {
try {
File directory = new File(getPackageLocalPath(context));
if (directory.exists()) {
Log.d("fileUtils", "" + directory.isDirectory());
}
//data文件夹权限比较高,一般是无法直接创建文件到data/目录下的
// directory=new File(Environment.getDataDirectory(),"swiftime");
if (!directory.exists()) {
directory.mkdirs();//没有目录先创建目录
}
File file = new File(directory.getPath() + File.separator + fileName + ".png");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
}
public static List<String> getChildrenFilePaths(String directoryName, Context context) {
List<String> filePaths = new ArrayList<>();
try {
File directory = context.getDir(directoryName, Context.MODE_PRIVATE);
if (directory.isDirectory()) {
File[] files = directory.listFiles();
for (File file : files) {
filePaths.add(file.getAbsolutePath());
}
}
} catch (Exception e) {
}
return filePaths;
}
/**
* 保存图片到本地 路径:/storage/emulated/0/mp3/hear.mp3
*
* @param fileName
* @param bitmap
* @throws IOException
*/
public static String saveBitmapToSdCard(Context context, String fileName, Bitmap bitmap) {
String filePath = "";
try {
if (bitmap == null) {
return filePath;
}
String directoryPath = getStorageDirectory();
File folderFile = new File(directoryPath);
if (!folderFile.exists()) {
folderFile.mkdirs();
}
filePath = directoryPath + File.separator + fileName + ".png";
File file = new File(filePath);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
//如果失败,就写入本地文件
saveBitmapToData(context, fileName, bitmap);
if (e != null) {
e.printStackTrace();
}
}
return filePath;
}
/**
* 保存图片到本地 路径:/storage/emulated/0/mp3/hear.mp3
*
* @param fileName
* @param bitmap
* @throws IOException
*/
public static String saveBitmapToSdCard(Context context, String directoryName, String fileName, Bitmap bitmap) {
String filePath = "";
try {
if (bitmap == null) {
return filePath;
}
String directory = getStorageDirectory(directoryName);
File folderFile = new File(directory);
if (!folderFile.exists()) {
folderFile.mkdirs();
}
filePath = directory + File.separator + fileName;
File file = new File(filePath);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
//如果失败,就写入本地文件
saveBitmapToData(context, fileName, bitmap);
if (e != null) {
e.printStackTrace();
}
}
return filePath;
}
public String copyFileTo(File srcFile, String directoryName, String fileName) throws IOException {
// 判断是否是文件
String filePath = "";
try {
if (srcFile.isDirectory()) {
return filePath;
}
String directory = getStorageDirectory(directoryName);
File folderFile = new File(directory);
if (!folderFile.exists()) {
folderFile.mkdirs();
}
filePath = directory + File.separator + fileName;
File file = new File(filePath);
file.createNewFile();
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(file);
int readLen = 0;
byte[] buf = new byte[1024];
while ((readLen = fis.read(buf)) != -1) {
fos.write(buf, 0, readLen);
}
fos.flush();
fos.close();
fis.close();
} catch (Exception e) {
CommonUtil.printStackTrace(e);
}
return filePath;
}
public static String inputStreamToFile(InputStream fis, String directoryName, String fileName) throws IOException {
// 判断是否是文件
String filePath = "";
try {
if(fis==null)
{
return filePath;
}
String directory = getStorageDirectory(directoryName);
File folderFile = new File(directory);
if (!folderFile.exists()) {
folderFile.mkdirs();
}
filePath = directory + File.separator + fileName;
File file = new File(filePath);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
int readLen = 0;
byte[] buf = new byte[1024];
while ((readLen = fis.read(buf)) != -1) {
fos.write(buf, 0, readLen);
}
fos.flush();
fos.close();
fis.close();
} catch (Exception e) {
CommonUtil.printStackTrace(e);
}
return filePath;
}
}