package net.oschina.app.ui; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import net.oschina.app.AppConfig; import net.oschina.app.AppContext; import net.oschina.app.AppException; import net.oschina.app.R; import net.oschina.app.adapter.GridViewFaceAdapter; import net.oschina.app.bean.Result; import net.oschina.app.bean.Tweet; import net.oschina.app.common.AudioRecordUtils; import net.oschina.app.common.FileUtils; import net.oschina.app.common.ImageUtils; import net.oschina.app.common.MediaUtils; import net.oschina.app.common.StringUtils; import net.oschina.app.common.UIHelper; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.os.Vibrator; import android.provider.MediaStore; import android.text.Editable; import android.text.InputFilter; import android.text.Spannable; import android.text.SpannableString; import android.text.TextWatcher; import android.text.style.ImageSpan; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; /** * 发表动弹 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class TweetPub extends BaseActivity{ private final static String TAG = "TweetPub"; // 录制 private final static byte RECORDER_STATE_RECARDING = 0x0; // 录制时间太短 private final static byte RECORDER_STATE_SHORT = 0x01; // 发布中 private final static byte TWEET_PUBING = 0X02; // 取消发布 private final static byte RECORDER_STATE_CANALE = 0x03; // 普通动弹 private final static byte TWEET_TYPE_CONTENT = 0X04; // 语音动弹 private final static byte TWEET_TYPE_VOICE = 0X05; // 语音最短时间(秒) private final static int RECORDER_TIME_MINTIME = 1; // 语音最长时间(秒) private final static int RECORDER_TIME_MAXTIME = 60; private AppContext ac; private DisplayMetrics dm; private FrameLayout mForm; private ImageView mBack; private EditText mContent; private Button mPublish; private ImageView mFace; // 语音按钮 private ImageView mAudio; private Button mRecorder; private ImageView mPick; private ImageView mAtme; private ImageView mSoftware; private ImageView mImage; private LinearLayout mClearwords; private TextView mNumberwords; private LinearLayout mRecardStatus;// 录音状态下的布局 private LinearLayout mRecardStatusShow;// 录音状态显示 private Handler mHandler; // 录制语音时涉及操作的控件 private FrameLayout mvFrame; private RelativeLayout mvAnimArea;// 录制声音大小布局 private ImageView mvVolume;// 录音音量 private RelativeLayout mvCancelArea;// 取消发布布局 private LinearLayout mvTooShort;// 录音太短 private TextView mvTimeMess;// 录音剩余时间提示 private AudioRecordUtils recordUtils;// 录音工具类 private GridView mGridView; private GridViewFaceAdapter mGVFaceAdapter; private Tweet tweet; private File imgFile; private File amrFile;// 语音文件 private String theLarge; private String theThumbnail; private InputMethodManager imm; private String tempTweetKey = AppConfig.TEMP_TWEET; private String tempTweetImageKey = AppConfig.TEMP_TWEET_IMAGE; public static LinearLayout mMessage; public static Context mContext; private static final int MAX_TEXT_LENGTH = 160;//最大输入字数 private static final String TEXT_ATME = "@请输入用户名 "; private static final String TEXT_SOFTWARE = "#请输入软件名#"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tweet_pub); mContext = this; //软键盘管理类 imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); //初始化基本视图 this.initView(); //初始化表情视图 this.initGridView(); } @Override protected void onDestroy() { deleteVoiceFile(); mContext = null; super.onDestroy(); } @Override protected void onResume() { super.onResume(); if(mGridView.getVisibility() == View.VISIBLE){ //隐藏表情 hideFace(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { if(mGridView.getVisibility() == View.VISIBLE) { //隐藏表情 hideFace(); }else{ return super.onKeyDown(keyCode, event); } } return true; } //初始化视图控件 private void initView() { // 获得手机屏幕的像素大小 ac = (AppContext)getApplication(); dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); mForm = (FrameLayout)findViewById(R.id.tweet_pub_form); mBack = (ImageView)findViewById(R.id.tweet_pub_back); mMessage = (LinearLayout)findViewById(R.id.tweet_pub_message); mImage = (ImageView)findViewById(R.id.tweet_pub_image); mPublish = (Button)findViewById(R.id.tweet_pub_publish); mContent = (EditText)findViewById(R.id.tweet_pub_content); mFace = (ImageView)findViewById(R.id.tweet_pub_footbar_face); // 录音的按钮 mAudio = (ImageView) findViewById(R.id.tweet_pub_footbar_audio); mRecorder = (Button) findViewById(R.id.tweet_pub_footbar_recarder); mPick = (ImageView)findViewById(R.id.tweet_pub_footbar_photo); mAtme = (ImageView)findViewById(R.id.tweet_pub_footbar_atme); mSoftware = (ImageView)findViewById(R.id.tweet_pub_footbar_software); mHandler = new Handler(); // 录音状态下的相关布局 mRecardStatus = (LinearLayout) findViewById(R.id.tweet_pub_record_status); mRecardStatusShow = (LinearLayout) findViewById(R.id.tweet_pub_record_status_show); mClearwords = (LinearLayout)findViewById(R.id.tweet_pub_clearwords); mNumberwords = (TextView)findViewById(R.id.tweet_pub_numberwords); recordUtils = new AudioRecordUtils(); // 录制语音时涉及操作的控件 mvFrame = (FrameLayout) findViewById(R.id.tweet_pub_voice_rcd_hint_rcding); mvAnimArea = (RelativeLayout) findViewById(R.id.tweet_pub_voice_rcd_hint_anim_area);// 录制声音大小布局 mvVolume = (ImageView) findViewById(R.id.tweet_pub_voice_rcd_hint_anim);// 录音状态动画 mvCancelArea = (RelativeLayout) findViewById(R.id.tweet_pub_voice_rcd_hint_cancel_area);// 取消发布布局 mvTooShort = (LinearLayout) findViewById(R.id.tweet_pub_voice_rcd_hint_tooshort);// 录音太短 mvTimeMess = (TextView) findViewById(R.id.tweet_pub_record_status_time_mes);// 录音剩余时间提示 mBack.setOnClickListener(UIHelper.finish(this)); mPublish.setOnClickListener(publishClickListener); mImage.setOnLongClickListener(imageLongClickListener); mFace.setOnClickListener(faceClickListener); mAudio.setOnClickListener(audioClickListener); mRecorder.setOnTouchListener(recorderTouchListener); mPick.setOnClickListener(pickClickListener); mAtme.setOnClickListener(atmeClickListener); mSoftware.setOnClickListener(softwareClickListener); mClearwords.setOnClickListener(clearwordsClickListener); //@某人 String atme = getIntent().getStringExtra("at_me"); int atuid = getIntent().getIntExtra("at_uid",0); if(atuid > 0){ tempTweetKey = AppConfig.TEMP_TWEET + "_" + atuid; tempTweetImageKey = AppConfig.TEMP_TWEET_IMAGE + "_" + atuid; } //编辑器添加文本监听 mContent.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { //保存当前EditText正在编辑的内容 ((AppContext)getApplication()).setProperty(tempTweetKey, s.toString()); //显示剩余可输入的字数 mNumberwords.setText((MAX_TEXT_LENGTH - s.length()) + ""); } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void afterTextChanged(Editable s) {} }); //编辑器点击事件 mContent.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //显示软键盘 showIMM(); } }); //设置最大输入字数 InputFilter[] filters = new InputFilter[1]; filters[0] = new InputFilter.LengthFilter(MAX_TEXT_LENGTH); mContent.setFilters(filters); //显示临时编辑内容 UIHelper.showTempEditContent(this, mContent, tempTweetKey); //显示临时保存图片 String tempImage = ((AppContext)getApplication()).getProperty(tempTweetImageKey); if(!StringUtils.isEmpty(tempImage)) { Bitmap bitmap = ImageUtils.loadImgThumbnail(tempImage, 100, 100); if(bitmap != null) { imgFile = new File(tempImage); mImage.setImageBitmap(bitmap); mImage.setVisibility(View.VISIBLE); } } if(atuid > 0 && mContent.getText().length() == 0){ mContent.setText(atme); mContent.setSelection(atme.length());//设置光标位置 } } //初始化表情控件 private void initGridView() { mGVFaceAdapter = new GridViewFaceAdapter(this); mGridView = (GridView)findViewById(R.id.tweet_pub_faces); mGridView.setAdapter(mGVFaceAdapter); mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //插入的表情 SpannableString ss = new SpannableString(view.getTag().toString()); Drawable d = getResources().getDrawable((int)mGVFaceAdapter.getItemId(position)); d.setBounds(0, 0, 35, 35);//设置表情图片的显示大小 ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM); ss.setSpan(span, 0, view.getTag().toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //在光标所在处插入表情 mContent.getText().insert(mContent.getSelectionStart(), ss); } }); } private void showIMM() { mFace.setTag(1); showOrHideIMM(); } private void showFace() { mFace.setImageResource(R.drawable.widget_bar_keyboard); mFace.setTag(1); mGridView.setVisibility(View.VISIBLE); } private void hideFace() { mFace.setImageResource(R.drawable.widget_bar_face); mFace.setTag(null); mGridView.setVisibility(View.GONE); } private void showOrHideIMM() { if(mFace.getTag() == null){ //隐藏软键盘 imm.hideSoftInputFromWindow(mContent.getWindowToken(), 0); //显示表情 showFace(); }else{ //显示软键盘 imm.showSoftInput(mContent, 0); //隐藏表情 hideFace(); } } private View.OnClickListener faceClickListener = new View.OnClickListener() { public void onClick(View v) { showOrHideIMM(); } }; // 显示录制操作选项 private void showRecareder() { mForm.setVisibility(View.GONE); mFace.setVisibility(View.GONE); mAudio.setTag(1); mAudio.setImageResource(R.drawable.widget_bar_keyboard); mRecorder.setVisibility(View.VISIBLE); mPick.setVisibility(View.GONE); mAtme.setVisibility(View.GONE); mSoftware.setVisibility(View.GONE); mRecardStatus.setVisibility(View.VISIBLE); mPublish.setVisibility(View.INVISIBLE); } // 隐藏录制操作选项 private void hideRecareder() { mAudio.setTag(null); mForm.setVisibility(View.VISIBLE); mFace.setVisibility(View.VISIBLE); mAudio.setImageResource(R.drawable.widget_bar_audio); mRecorder.setVisibility(View.GONE); mPick.setVisibility(View.VISIBLE); mAtme.setVisibility(View.VISIBLE); mSoftware.setVisibility(View.VISIBLE); mRecardStatus.setVisibility(View.GONE); mvTimeMess.setVisibility(View.INVISIBLE); mPublish.setVisibility(View.VISIBLE); } // 显示录音操作 private void showOrHideRecarder() { //隐藏软键盘 imm.hideSoftInputFromWindow(mContent.getWindowToken(), 0); //隐藏表情 hideFace(); mvTooShort.setVisibility(View.GONE); if (mAudio.getTag() == null) { showRecareder(); } else { hideRecareder(); } } // 语音按钮监听事件 private View.OnClickListener audioClickListener = new View.OnClickListener() { public void onClick(View v) { // 用户如果没有登录 if(!ac.isLogin()){ UIHelper.showLoginDialog(TweetPub.this); return; } showOrHideRecarder(); } }; private void showRecarderStatus(byte type) { switch (type) { case RECORDER_STATE_RECARDING: mvAnimArea.setVisibility(View.VISIBLE); mvCancelArea.setVisibility(View.GONE); break; case RECORDER_STATE_CANALE: mvAnimArea.setVisibility(View.GONE); mvCancelArea.setVisibility(View.VISIBLE); break; case RECORDER_STATE_SHORT: mvFrame.setVisibility(View.GONE); mRecardStatusShow.setVisibility(View.VISIBLE); mvTooShort.setVisibility(View.VISIBLE); mHandler.postDelayed(new Runnable() { public void run() { mRecardStatusShow.setVisibility(View.GONE); mvTooShort.setVisibility(View.GONE); mvFrame.setVisibility(View.VISIBLE); } }, 1000); break; default: break; } } // 定时任务间隔时间 private static final int POLL_INTERVAL = 300; // 录音音量状态展示 private Runnable mPollTask = new Runnable() { public void run() { double amp = recordUtils.getAmplitude(); updateDisplay(amp); mHandler.postDelayed(mPollTask, POLL_INTERVAL); } }; // 录音计时器 private Runnable mTimerTask = new Runnable() { int i = 0; public void run() { if (!isRecording) return; i++; if (i == RECORDER_TIME_MAXTIME) { IS_OVERTIME = true; i = 0; mvTimeMess.setVisibility(View.INVISIBLE); return; } if (i >= RECORDER_TIME_MAXTIME - 10) { if (i == RECORDER_TIME_MAXTIME - 10) { // 震动 Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(300); } mvTimeMess.setVisibility(View.VISIBLE); mvTimeMess.setText("录音时间还剩下" + (RECORDER_TIME_MAXTIME - i) + "秒"); } mHandler.postDelayed(mTimerTask, 1000); } }; // 录音的路径 private String savePath; // 语音动弹文件名 private String fileName; // 是否正在录音中 private boolean isRecording = false; // 是否超时 private boolean IS_OVERTIME = false; // 开始录制语音动弹 private void startRecorder(String name) { if (StringUtils.isEmpty(savePath)) return; recordUtils.start(savePath, name); mHandler.postDelayed(mPollTask, POLL_INTERVAL); mHandler.postDelayed(mTimerTask, 1000); } // 停止录音操作 private void stopRecorder() { mRecardStatusShow.setVisibility(View.GONE); mHandler.removeCallbacks(mPollTask); mHandler.removeCallbacks(mTimerTask); recordUtils.stop(); amrFile = new File(savePath, fileName); mvVolume.setImageResource(R.drawable.tweet_amp1); } // 删除录音文件 private void deleteVoiceFile() { File newPath = new File(savePath + fileName); boolean res = newPath.delete(); Log.i(TAG, res + ""); } // 语音录制按钮触摸事件 private View.OnTouchListener recorderTouchListener = new View.OnTouchListener() { long startVoiceT = 0;// 开始时间 long endVoiceT = 0;// 结束世间 int startY = 0;// 开始的Y byte state = RECORDER_STATE_RECARDING; public boolean onTouch(View v, MotionEvent event) { // 超时 if (IS_OVERTIME) { mvTimeMess.setVisibility(View.INVISIBLE); stopRecorder(); mRecorder.setBackgroundResource(R.color.weight_bar_buttonup); mRecorder.setText("按住 说话"); // 状态为取消 if (state == RECORDER_STATE_CANALE || state == TWEET_PUBING) { deleteVoiceFile(); amrFile = null; if (state == RECORDER_STATE_CANALE) IS_OVERTIME = false; return false; } if (state != TWEET_PUBING) { state = TWEET_PUBING; pubTweet(TWEET_TYPE_VOICE, "#语音分享#"); } return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isRecording = true; savePath = getRecorderPath(); MediaPlayer md = MediaPlayer.create(TweetPub.this, R.raw.notificationsound); md.start(); // 提示音播放完开始录音 md.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { startRecorder(fileName); } }); IS_OVERTIME = false; mRecorder.setBackgroundResource(R.color.weight_bar_buttondown); mRecorder.setText("松开 结束"); // 按下时记录录音文件名 String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); fileName = ac.getLoginUid() + "_" + timeStamp + ".amr";// 语音动弹命名 startY = (int) event.getY(); startVoiceT = System.currentTimeMillis(); // 隐藏软键盘 mRecardStatusShow.setVisibility(View.VISIBLE); break; case MotionEvent.ACTION_MOVE: int tempY = (int) event.getY(); if (Math.abs(startY - tempY) > dm.heightPixels / 3) { // 取消 state = RECORDER_STATE_CANALE; showRecarderStatus(RECORDER_STATE_CANALE); } else { // 录音 state = RECORDER_STATE_RECARDING; showRecarderStatus(RECORDER_STATE_RECARDING); } break; case MotionEvent.ACTION_UP: isRecording = false; mRecorder.setBackgroundResource(R.color.weight_bar_buttonup); mRecorder.setText("按住 说话"); endVoiceT = System.currentTimeMillis(); long voiceT = endVoiceT - startVoiceT; // 停止录音 stopRecorder(); // 录音小于最小时间 if (voiceT < RECORDER_TIME_MINTIME * 1000 || state == RECORDER_STATE_CANALE) { deleteVoiceFile(); amrFile = null; if (voiceT < RECORDER_TIME_MINTIME * 1000) showRecarderStatus(RECORDER_STATE_SHORT); if (state == RECORDER_STATE_CANALE) mvTimeMess.setVisibility(View.INVISIBLE); return false; } pubTweet(TWEET_TYPE_VOICE, "#语音分享#"); break; default: break; } return false; } }; private View.OnClickListener pickClickListener = new View.OnClickListener() { public void onClick(View v) { //隐藏软键盘 imm.hideSoftInputFromWindow(v.getWindowToken(), 0); //隐藏表情 hideFace(); CharSequence[] items = { TweetPub.this.getString(R.string.img_from_album), TweetPub.this.getString(R.string.img_from_camera) }; imageChooseItem(items); } }; private View.OnClickListener atmeClickListener = new View.OnClickListener() { public void onClick(View v) { //显示软键盘 showIMM(); //在光标所在处插入“@用户名” int curTextLength = mContent.getText().length(); if(curTextLength < MAX_TEXT_LENGTH) { String atme = TEXT_ATME; int start,end; if((MAX_TEXT_LENGTH - curTextLength) >= atme.length()) { start = mContent.getSelectionStart() + 1; end = start + atme.length() - 2; } else { int num = MAX_TEXT_LENGTH - curTextLength; if(num < atme.length()) { atme = atme.substring(0, num); } start = mContent.getSelectionStart() + 1; end = start + atme.length() - 1; } if(start > MAX_TEXT_LENGTH || end > MAX_TEXT_LENGTH) { start = MAX_TEXT_LENGTH; end = MAX_TEXT_LENGTH; } mContent.getText().insert(mContent.getSelectionStart(), atme); mContent.setSelection(start, end);//设置选中文字 } } }; private View.OnClickListener softwareClickListener = new View.OnClickListener() { public void onClick(View v) { //显示软键盘 showIMM(); //在光标所在处插入“#软件名#” int curTextLength = mContent.getText().length(); if(curTextLength < MAX_TEXT_LENGTH) { String software = TEXT_SOFTWARE; int start,end; if((MAX_TEXT_LENGTH - curTextLength) >= software.length()) { start = mContent.getSelectionStart() + 1; end = start + software.length() - 2; } else { int num = MAX_TEXT_LENGTH - curTextLength; if(num < software.length()) { software = software.substring(0, num); } start = mContent.getSelectionStart() + 1; end = start + software.length() - 1; } if(start > MAX_TEXT_LENGTH || end > MAX_TEXT_LENGTH) { start = MAX_TEXT_LENGTH; end = MAX_TEXT_LENGTH; } mContent.getText().insert(mContent.getSelectionStart(), software); mContent.setSelection(start, end);//设置选中文字 } } }; private View.OnClickListener clearwordsClickListener = new View.OnClickListener() { public void onClick(View v) { String content = mContent.getText().toString(); if(!StringUtils.isEmpty(content)){ UIHelper.showClearWordsDialog(v.getContext(), mContent, mNumberwords); } } }; private View.OnLongClickListener imageLongClickListener = new View.OnLongClickListener() { public boolean onLongClick(View v) { //隐藏软键盘 imm.hideSoftInputFromWindow(v.getWindowToken(), 0); new AlertDialog.Builder(v.getContext()) .setIcon(android.R.drawable.ic_dialog_info) .setTitle(getString(R.string.delete_image)) .setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //清除之前保存的编辑图片 ((AppContext)getApplication()).removeProperty(tempTweetImageKey); imgFile = null; mImage.setVisibility(View.GONE); dialog.dismiss(); } }) .setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create().show(); return true; } }; /** * 获得语音动弹保存的路径 * @return */ private String getRecorderPath() { return FileUtils.getAppCache(TweetPub.this, "voiceTweet"); } /** * 操作选择 * @param items */ public void imageChooseItem(CharSequence[] items ) { AlertDialog imageDialog = new AlertDialog.Builder(this).setTitle(R.string.ui_insert_image).setIcon(android.R.drawable.btn_star).setItems(items, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int item) { //手机选图 if( item == 0 ) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, "选择图片"),ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD); } //拍照 else if( item == 1 ) { String savePath = ""; //判断是否挂载了SD卡 String storageState = Environment.getExternalStorageState(); if(storageState.equals(Environment.MEDIA_MOUNTED)){ savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/OSChina/Camera/";//存放照片的文件夹 File savedir = new File(savePath); if (!savedir.exists()) { savedir.mkdirs(); } } //没有挂载SD卡,无法保存文件 if(StringUtils.isEmpty(savePath)){ UIHelper.ToastMessage(TweetPub.this, "无法保存照片,请检查SD卡是否挂载"); return; } String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String fileName = "osc_" + timeStamp + ".jpg";//照片命名 File out = new File(savePath, fileName); Uri uri = Uri.fromFile(out); theLarge = savePath + fileName;//该照片的绝对路径 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA); } }}).create(); imageDialog.show(); } @Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { if(resultCode != RESULT_OK) return; final Handler handler = new Handler(){ public void handleMessage(Message msg) { if(msg.what == 1 && msg.obj != null){ //显示图片 mImage.setImageBitmap((Bitmap)msg.obj); mImage.setVisibility(View.VISIBLE); } } }; new Thread(){ public void run() { Bitmap bitmap = null; if(requestCode == ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD) { if(data == null) return; Uri thisUri = data.getData(); String thePath = ImageUtils.getAbsolutePathFromNoStandardUri(thisUri); //如果是标准Uri if(StringUtils.isEmpty(thePath)) { theLarge = ImageUtils.getAbsoluteImagePath(TweetPub.this,thisUri); } else { theLarge = thePath; } String attFormat = FileUtils.getFileFormat(theLarge); if(!"photo".equals(MediaUtils.getContentType(attFormat))) { Toast.makeText(TweetPub.this, getString(R.string.choose_image), Toast.LENGTH_SHORT).show(); return; } //获取图片缩略图 只有Android2.1以上版本支持 if(AppContext.isMethodsCompat(android.os.Build.VERSION_CODES.ECLAIR_MR1)){ String imgName = FileUtils.getFileName(theLarge); bitmap = ImageUtils.loadImgThumbnail(TweetPub.this, imgName, MediaStore.Images.Thumbnails.MICRO_KIND); } if(bitmap == null && !StringUtils.isEmpty(theLarge)) { bitmap = ImageUtils.loadImgThumbnail(theLarge, 100, 100); } } //拍摄图片 else if(requestCode == ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA) { if(bitmap == null && !StringUtils.isEmpty(theLarge)) { bitmap = ImageUtils.loadImgThumbnail(theLarge, 100, 100); } } if(bitmap!=null) { //存放照片的文件夹 String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/OSChina/Camera/"; File savedir = new File(savePath); if (!savedir.exists()) { savedir.mkdirs(); } String largeFileName = FileUtils.getFileName(theLarge); String largeFilePath = savePath + largeFileName; //判断是否已存在缩略图 if(largeFileName.startsWith("thumb_") && new File(largeFilePath).exists()) { theThumbnail = largeFilePath; imgFile = new File(theThumbnail); } else { //生成上传的800宽度图片 String thumbFileName = "thumb_" + largeFileName; theThumbnail = savePath + thumbFileName; if(new File(theThumbnail).exists()) { imgFile = new File(theThumbnail); } else { try { //压缩上传的图片 ImageUtils.createImageThumbnail(TweetPub.this, theLarge, theThumbnail, 800, 80); imgFile = new File(theThumbnail); } catch (IOException e) { e.printStackTrace(); } } } //保存动弹临时图片 ((AppContext)getApplication()).setProperty(tempTweetImageKey, theThumbnail); Message msg = new Message(); msg.what = 1; msg.obj = bitmap; handler.sendMessage(msg); } }; }.start(); } /** * 发布动弹 * @param tweetType 动弹类型 * @param content 文本动弹的内容 */ private void pubTweet(final byte tweetType, String content) { IS_OVERTIME = false; if(!ac.isLogin()){ UIHelper.showLoginDialog(TweetPub.this); return; } mMessage.setVisibility(View.VISIBLE); mForm.setVisibility(View.GONE); tweet = new Tweet(); tweet.setAuthorId(ac.getLoginUid()); tweet.setBody(content); if (tweetType == TWEET_TYPE_CONTENT) { tweet.setImageFile(imgFile); } if (tweetType == TWEET_TYPE_VOICE) { // 设置语音动弹的文件 tweet.setAmrFile(amrFile); mvTimeMess.setVisibility(View.INVISIBLE); } final Handler handler = new Handler(){ public void handleMessage(Message msg) { if(msg.what == 1){ //清除之前保存的编辑内容 ac.removeProperty(tempTweetKey,tempTweetImageKey); finish(); }else{ mMessage.setVisibility(View.GONE); if (tweetType == TWEET_TYPE_CONTENT) mForm.setVisibility(View.VISIBLE); else showOrHideRecarder(); } } }; new Thread(){ public void run() { Message msg =new Message(); Result res = null; int what = 0; try { res = ac.pubTweet(tweet); what = 1; msg.what = 1; msg.obj = res; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } handler.sendMessage(msg); UIHelper.sendBroadCastTweet(TweetPub.this, what, res, tweet); } }.start(); } private View.OnClickListener publishClickListener = new View.OnClickListener() { public void onClick(View v) { //隐藏软键盘 imm.hideSoftInputFromWindow(v.getWindowToken(), 0); String content = mContent.getText().toString(); if(StringUtils.isEmpty(content)){ UIHelper.ToastMessage(v.getContext(), "请输入动弹内容"); return; } // 调用动弹发布方法 pubTweet(TWEET_TYPE_CONTENT, content); } }; // 根据录制音量的大小定时更新状态图片 private void updateDisplay(double signalEMA) { switch ((int) signalEMA) { case 0: case 1: mvVolume.setImageResource(R.drawable.tweet_amp1); break; case 2: case 3: mvVolume.setImageResource(R.drawable.tweet_amp2); break; case 4: case 5: mvVolume.setImageResource(R.drawable.tweet_amp3); break; case 6: case 7: mvVolume.setImageResource(R.drawable.tweet_amp4); break; case 8: case 9: mvVolume.setImageResource(R.drawable.tweet_amp5); break; case 10: case 11: mvVolume.setImageResource(R.drawable.tweet_amp6); break; default: mvVolume.setImageResource(R.drawable.tweet_amp7); break; } } }