我使用开放源代码加入,为我的应用程序添加了新的可能性。用于编辑声音。 现在,我无法将文件发送到活动且遇到错误的
编辑语音的新活动:
// Result codes
private static final int REQUEST_CODE_CHOOSE_CONTACT = 1;
/**
* This is a special intent action that means "edit a sound file".
*/
public static final String EDIT = "com.example.soundrecorder.action.EDIT";
//
// Public methods and protected overrides
//
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
Log.v("Ringdroid", "EditActivity OnCreate");
super.onCreate(icicle);
mPlayer = null;
mIsPlaying = false;
mAlertDialog = null;
mProgressDialog = null;
mLoadSoundFileThread = null;
mRecordAudioThread = null;
mSaveSoundFileThread = null;
Intent intent = getIntent();
// If the Ringdroid media select activity was launched via a
// GET_CONTENT intent, then we shouldn't display a "saved"
// message when the user saves, we should just return whatever
// they create.
mWasGetContentIntent = intent.getBooleanExtra("was_get_content_intent", false);
mFilename = intent.getData().toString().replaceFirst("file://", "").replaceAll("%20", " ");
mSoundFile = null;
mKeyDown = false;
mHandler = new Handler();
loadGui();
mHandler.postDelayed(mTimerRunnable, 100);
if (!mFilename.equals("record")) {
loadFromFile();
} else {
recordAudio();
}
}
private void closeThread(Thread thread) {
if (thread != null && thread.isAlive()) {
try {
thread.join();
} catch (InterruptedException e) {
}
}
}
/** Called when the activity is finally destroyed. */
@Override
protected void onDestroy() {
Log.v("Ringdroid", "EditActivity OnDestroy");
mLoadingKeepGoing = false;
mRecordingKeepGoing = false;
closeThread(mLoadSoundFileThread);
closeThread(mRecordAudioThread);
closeThread(mSaveSoundFileThread);
mLoadSoundFileThread = null;
mRecordAudioThread = null;
mSaveSoundFileThread = null;
if(mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
if(mAlertDialog != null) {
mAlertDialog.dismiss();
mAlertDialog = null;
}
if (mPlayer != null) {
if (mPlayer.isPlaying() || mPlayer.isPaused()) {
mPlayer.stop();
}
mPlayer.release();
mPlayer = null;
}...
我选择和发送声音进行编辑的活动:
package com.example.soundrecorder.adapters;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import com.example.soundrecorder.DBHelper;
import com.example.soundrecorder.R;
import com.example.soundrecorder.RecordingItem;
import com.example.soundrecorder.fragments.PlaybackFragment;
import com.example.soundrecorder.listeners.OnDatabaseChangedListener;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
/**
* Created by Daniel on 12/29/2014.
*/
public class FileViewerAdapter extends RecyclerView.Adapter<FileViewerAdapter.RecordingsViewHolder>
implements OnDatabaseChangedListener {
private static final String LOG_TAG = "FileViewerAdapter";
private DBHelper mDatabase;
RecordingItem item;
Context mContext;
LinearLayoutManager llm;
private SimpleCursorAdapter mAdapter;
private boolean mWasGetContentIntent;
public FileViewerAdapter(Context context, LinearLayoutManager linearLayoutManager) {
super();
mContext = context;
mDatabase = new DBHelper(mContext);
mDatabase.setOnDatabaseChangedListener(this);
llm = linearLayoutManager;
}
@Override
public void onBindViewHolder(final RecordingsViewHolder holder, int position) {
item = getItem(position);
long itemDuration = item.getLength();
long minutes = TimeUnit.MILLISECONDS.toMinutes(itemDuration);
long seconds = TimeUnit.MILLISECONDS.toSeconds(itemDuration)
- TimeUnit.MINUTES.toSeconds(minutes);
holder.vName.setText(item.getName());
holder.vLength.setText(String.format("%02d:%02d", minutes, seconds));
holder.vDateAdded.setText(
DateUtils.formatDateTime(
mContext,
item.getTime(),
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_YEAR
)
);
// define an on click listener to open PlaybackFragment
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
PlaybackFragment playbackFragment =
new PlaybackFragment().newInstance(getItem(holder.getPosition()));
FragmentTransaction transaction = ((FragmentActivity) mContext)
.getSupportFragmentManager()
.beginTransaction();
playbackFragment.show(transaction, "dialog_playback");
} catch (Exception e) {
Log.e(LOG_TAG, "exception", e);
}
}
});
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ArrayList<String> entrys = new ArrayList<String>();
entrys.add(mContext.getString(R.string.dialog_file_share));
entrys.add(mContext.getString(R.string.dialog_file_edit));
entrys.add(mContext.getString(R.string.dialog_file_rename));
entrys.add(mContext.getString(R.string.dialog_file_delete));
final CharSequence[] items = entrys.toArray(new CharSequence[entrys.size()]);
// File delete confirm
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(mContext.getString(R.string.dialog_title_options));
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
shareFileDialog(holder.getPosition());
} if (item == 1){
editFileActivity(holder.getPosition());
} if (item == 2) {
renameFileDialog(holder.getPosition());
} else if (item == 3) {
deleteFileDialog(holder.getPosition());
}
}
});
builder.setCancelable(true);
builder.setNegativeButton(mContext.getString(R.string.dialog_action_cancel),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
return false;
}
});
}
@Override
public RecordingsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.card_view, parent, false);
mContext = parent.getContext();
return new RecordingsViewHolder(itemView);
}
public static class RecordingsViewHolder extends RecyclerView.ViewHolder {
protected TextView vName;
protected TextView vLength;
protected TextView vDateAdded;
protected View cardView;
public RecordingsViewHolder(View v) {
super(v);
vName = v.findViewById(R.id.file_name_text);
vLength = v.findViewById(R.id.file_length_text);
vDateAdded = v.findViewById(R.id.file_date_added_text);
cardView = v.findViewById(R.id.card_view);
}
}
@Override
public int getItemCount() {
return mDatabase.getCount();
}
public RecordingItem getItem(int position) {
return mDatabase.getItemAt(position);
}
@Override
public void onNewDatabaseEntryAdded() {
//item added to top of the list
notifyItemInserted(getItemCount() - 1);
llm.scrollToPosition(getItemCount() - 1);
}
@Override
//TODO
public void onDatabaseEntryRenamed() {
}
public void remove(int position) {
//remove item from database, recyclerview and storage
//delete file from storage
File file = new File(getItem(position).getFilePath());
file.delete();
Toast.makeText(
mContext,
String.format(
mContext.getString(R.string.toast_file_delete),
getItem(position).getName()
),
Toast.LENGTH_SHORT
).show();
mDatabase.removeItemWithId(getItem(position).getId());
notifyItemRemoved(position);
}
//TODO
public void removeOutOfApp(String filePath) {
//user deletes a saved recording out of the application through another application
}
public void rename(int position, String name) {
//rename a file
String mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath();
mFilePath += "/SoundRecorder/" + name;
File f = new File(mFilePath);
if (f.exists() && !f.isDirectory()) {
//file name is not unique, cannot rename file.
Toast.makeText(mContext,
String.format(mContext.getString(R.string.toast_file_exists), name),
Toast.LENGTH_SHORT).show();
} else {
//file name is unique, rename file
File oldFilePath = new File(getItem(position).getFilePath());
oldFilePath.renameTo(f);
mDatabase.renameItem(getItem(position), name, mFilePath);
notifyItemChanged(position);
}
}
public void shareFileDialog(int position) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(getItem(position).getFilePath())));
shareIntent.setType("audio/mp4");
mContext.startActivity(Intent.createChooser(shareIntent, mContext.getText(R.string.send_to)));
}
public void editFileActivity (int position){
Intent editintent = new Intent(Intent.ACTION_EDIT,Uri.parse(String.valueOf(position)));
boolean mWasGetContentIntent= editintent.getAction().equals(Intent.ACTION_GET_CONTENT);
editintent.putExtra("was_get_content_intent",mWasGetContentIntent);
editintent.setClassName("com.example.soundrecorder;","com.example.soundrecorder.activities.EditVoiceActivity");
mContext.startActivity(editintent);
}
public void renameFileDialog (final int position) {
// File rename dialog
AlertDialog.Builder renameFileBuilder = new AlertDialog.Builder(mContext);
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.dialog_rename_file, null);
final EditText input = view.findViewById(R.id.new_name);
renameFileBuilder.setTitle(mContext.getString(R.string.dialog_title_rename));
renameFileBuilder.setCancelable(true);
renameFileBuilder.setPositiveButton(mContext.getString(R.string.dialog_action_ok),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
String value = input.getText().toString().trim() + ".mp4";
rename(position, value);
} catch (Exception e) {
Log.e(LOG_TAG, "exception", e);
}
dialog.cancel();
}
});
renameFileBuilder.setNegativeButton(mContext.getString(R.string.dialog_action_cancel),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
renameFileBuilder.setView(view);
AlertDialog alert = renameFileBuilder.create();
alert.show();
}
public void deleteFileDialog (final int position) {
// File delete confirm
AlertDialog.Builder confirmDelete = new AlertDialog.Builder(mContext);
confirmDelete.setTitle(mContext.getString(R.string.dialog_title_delete));
confirmDelete.setMessage(mContext.getString(R.string.dialog_text_delete));
confirmDelete.setCancelable(true);
confirmDelete.setPositiveButton(mContext.getString(R.string.dialog_action_yes),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
//remove item from database, recyclerview, and storage
remove(position);
} catch (Exception e) {
Log.e(LOG_TAG, "exception", e);
}
dialog.cancel();
}
});
confirmDelete.setNegativeButton(mContext.getString(R.string.dialog_action_no),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = confirmDelete.create();
alert.show();
}
}
我不知道如何发送正确的信息。
发送方法: 公共无效editFileActivity
我的来源:https://github.com/Navid-j/SoundRecorder 环形来源:https://github.com/google/ringdroid