package nico.styTool; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.style.ImageSpan; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.EditText; import android.widget.GridView; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Set; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.BmobUser; import cn.bmob.v3.datatype.BmobFile; import cn.bmob.v3.exception.BmobException; import cn.bmob.v3.listener.QueryListener; import cn.bmob.v3.listener.SaveListener; import cn.bmob.v3.listener.UploadBatchListener; import cn.bmob.v3.listener.UploadFileListener; import dump.k.i_a; import dump.z.BaseActivity_; /** * Created by luxin on 15-12-10. * http://luxin.gitcafe.io */ public class PublishActivity extends BaseActivity_ implements View.OnClickListener { private EditText ediContent; private MyUser myUser = null; private HorizontalScrollView scrollPicContent; private LinearLayout layPicContent; private LinearLayout btnCamera; private LinearLayout btnEmotion; private LinearLayout btnSend; private ViewPager emojPager; private boolean isOpen = false; private ArrayList<GridView> mGridViews; private static final int REQUEST_CODE = 1; private ProgressDialog mProgressDialog; private List<String> filePhotos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.push_help); myUser = BmobUser.getCurrentUser(MyUser.class); if (myUser.getAuvter() != null) { } else { Intent a = new Intent(PublishActivity.this, UserProfileActivity.class); startActivity(a); finish(); Toast.makeText(PublishActivity.this, "请上传头像", Toast.LENGTH_SHORT).show(); } xft(); initView(); initEmojGridview(); initEvent(); } @Override protected void onRestart() { super.onRestart(); refresUI(); } @Override protected void onResume() { super.onResume(); refresUI(); } private void xft() { BmobQuery<i_a> query = new BmobQuery<>(); query.getObject("03bf357e85", new QueryListener<i_a>() { @Override public void done(i_a movie, BmobException e) { if (e == null) { String s = movie.getContent(); String sr = nico.styTool.Constant.a_mi + "\n" + nico.styTool.Constant.a_miui; if (s.equals(sr)) { } else { nico.styTool.ToastUtil.show(PublishActivity.this, "版本不一致,请更新", Toast.LENGTH_SHORT); finish(); } } else { finish(); } } }); } private void initEmojGridview() { mGridViews = new ArrayList<GridView>(); LayoutInflater inflater = LayoutInflater.from(this); mGridViews.clear(); for (int i = 0; i < 6; i++) { final int j = i; GridView gridView = (GridView) inflater.inflate(R.layout.lxw_emoj_gridview, null, false); gridView.setAdapter(new EmotionGridViewAdapter(this, i)); mGridViews.add(gridView); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position > 0 && (position % 20 == 0) || (j == 5 && position == 5)) { int selectionStart = ediContent.getSelectionStart(); String str = ediContent.getText().toString(); String strTemp = str.substring(0, selectionStart); if (!TextUtils.isEmpty(str)) { int i = strTemp.lastIndexOf("]"); if (i == strTemp.length() - 1) { int j = strTemp.lastIndexOf("["); ediContent.getEditableText().delete(j, selectionStart); } else { ediContent.getEditableText().delete(strTemp.length() - 1, selectionStart); } } } else { //Log.e(TAG, "=====onItemClick===" + position); String str = Expression.emojName[position + j * 20]; SpannableString spannableString = new SpannableString(str); //Log.e(TAG, "====Expression.getIdAsName(str)===" + Expression.getIdAsName(str)); Drawable drawable = PublishActivity.this.getResources().getDrawable(Expression.getIdAsName(str)); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannableString.setSpan(imageSpan, 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); int cuors = ediContent.getSelectionStart(); ediContent.getText().insert(cuors, spannableString); } } }); } } private void initView() { ediContent = (EditText) findViewById(R.id.id_lxw_push_content); scrollPicContent = (HorizontalScrollView) findViewById(R.id.id_lxw_push_scrollPicContent); layPicContent = (LinearLayout) findViewById(R.id.id_lxw_push_layPicContent); btnCamera = (LinearLayout) findViewById(R.id.id_lxw_push_btn_btnCamera); btnEmotion = (LinearLayout) findViewById(R.id.id_lxw_push_btn_btnEmotion); btnSend = (LinearLayout) findViewById(R.id.btnSend); emojPager = (ViewPager) findViewById(R.id.id_lxw_push_emoj_viewpager); } private void initEvent() { btnCamera.setOnClickListener(this); btnEmotion.setOnClickListener(this); emojPager.setOnClickListener(this); btnSend.setOnClickListener(this); ediContent.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (isOpen) { openKeyBoard(); isOpen = false; showEmotion(isOpen); } return false; } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.id_lxw_push_btn_btnCamera: Intent intent = new Intent(this, ChoseImgActivity.class); startActivityForResult(intent, REQUEST_CODE); break; case R.id.id_lxw_push_btn_btnEmotion: //Log.e(TAG, "=============>emotion"); if (isOpen) { isOpen = false; } else { isOpen = true; } showEmotion(isOpen); break; case R.id.btnSend: openKeyBoard(); pushHelp(); break; } } private void showEmotion(boolean isOpen) { if (isOpen) { // hidenkeyBoard(); openKeyBoard(); emojPager.setVisibility(View.VISIBLE); initEmotionUp(); } else { emojPager.setVisibility(View.GONE); } } public void openKeyBoard() { InputMethodManager imm = (InputMethodManager) this .getSystemService(Context.INPUT_METHOD_SERVICE); // 得到InputMethodManager的实例 if (imm.isActive()) { // 如果开启 imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS); // 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的 } } /** * 隐藏软键盘 */ private void hidenkeyBoard() { if (this.getCurrentFocus() != null) { ((InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY); } } private void initEmotionUp() { // Log.e(TAG, "======initEmotionUp========="); emojPager.setAdapter(new EmotionPagerAdapter(this, mGridViews)); emojPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE) { Bundle datas = data.getExtras(); // String imgs[]=datas.getStringArray("pics"); refresUI(); } } /** * */ private void refresUI() { Set<String> Imgs = ImageChoseAdapter.mSelectImg; if (Imgs.size() == 0) { scrollPicContent.setVisibility(View.GONE); return; } if (Imgs.size() > 0) { if (layPicContent != null) { layPicContent.removeAllViews(); scrollPicContent.setVisibility(View.VISIBLE); } for (String path : Imgs) { View itemView = LayoutInflater.from(PublishActivity.this).inflate(R.layout.lxw_item_publish_pic, null); ImageView img = (ImageView) itemView.findViewById(R.id.id_lxw_publish_pic_img); itemView.setTag(path); itemView.setOnClickListener(onPicTureClickListener); ImageLoader.getInstance(2, ImageLoader.Type.LIFO).loaderImage(path, img, false); if (layPicContent != null) { LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); layPicContent.addView(itemView, lp); } } } else { if (scrollPicContent != null) { scrollPicContent.setVisibility(View.GONE); } } } private View.OnClickListener onPicTureClickListener = new View.OnClickListener() { @Override public void onClick(View v) { final String path = v.getTag().toString(); AlertDialog.Builder builder = new AlertDialog.Builder(PublishActivity.this); AlertDialog alert = builder.setMessage("确认删除图片?") .setNegativeButton(android.R.string.no, null) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ImageChoseAdapter.mSelectImg.remove(path); for (int i = 0; i < layPicContent.getChildCount(); i++) { View view = layPicContent.getChildAt(i); if (view.getTag().toString().equals(path)) { layPicContent.removeView(view); break; } } if (ImageChoseAdapter.mSelectImg == null || ImageChoseAdapter.mSelectImg.size() == 0) { scrollPicContent.setVisibility(View.GONE); } } }).create(); alert.show(); } }; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x110) { // mProgressDialog.dismiss(); } } }; private void pushHelp() { final String content = ediContent.getText().toString().trim(); if (TextUtils.isEmpty(content)) { return; } mProgressDialog = ProgressDialog.show(this, null, "正在上传"); new Thread() { @Override public void run() { List<String> list = new ArrayList<String>(ImageChoseAdapter.mSelectImg); if (list.size() > 0) { getCacheImgFiles(PublishActivity.this, list); uploader(filePhotos, content); } else { saveText(content); } mHandler.sendEmptyMessage(0x110); } }.start(); // savePulish(title, content, list); } private void saveText(String content) { MyUser user = BmobUser.getCurrentUser(MyUser.class); BILIBILI helps = new BILIBILI(); helps.setUser(user); helps.setContent(content); helps.setState(0); helps.setLikeNum(1); helps.save(new SaveListener<String>() { @Override public void done(String objectId, BmobException e) { if (e == null) { finish(); mProgressDialog.dismiss(); //Log.i("bmob", "保存成功"); } else { mProgressDialog.dismiss(); //Log.i("bmob", "保存失败:" + e.getMessage()); } } }); } private void savePulish(String content, PhontoFiles files) { MyUser user = BmobUser.getCurrentUser(MyUser.class); BILIBILI helps = new BILIBILI(); helps.setUser(user); helps.setContent(content); helps.setState(0); helps.setLikeNum(1); helps.setPhontofile(files); helps.save(new SaveListener<String>() { @Override public void done(String objectId, BmobException e) { if (e == null) { finish(); mProgressDialog.dismiss(); } else { mProgressDialog.dismiss(); } } }); } /** * 上传图片 * * @param list * @return */ private void uploader(List<String> list, final String content) { final PhontoFiles phontoFiles = new PhontoFiles(); final PhontoFiles ps = new PhontoFiles(); if (list.size() == 1) { File file = new File(list.get(0)); final BmobFile bmobFile = new BmobFile(file); bmobFile.uploadblock(new UploadFileListener() { @Override public void done(BmobException e) { if (e == null) { //bmobFile.getFileUrl()--返回的上传文件的完整地址 phontoFiles.setPhoto(bmobFile.getFileUrl()); phontoFiles.save(new SaveListener<String>() { @Override public void done(String objectId, BmobException e) { if (e == null) { ps.setObjectId(phontoFiles.getObjectId()); //Log.e(TAG, "hjkhjkh=======>" + phontoFiles.getObjectId()); savePulish(content, phontoFiles); } else { finish(); } } }); } else { //toast("上传文件失败:" + e.getMessage()); } } @Override public void onProgress(Integer value) { // 返回的上传进度(百分比) } }); } else { String[] filePaths = list.toArray(new String[list.size()]); //final String[] filePaths = new String[2]; BmobFile.uploadBatch(filePaths, new UploadBatchListener() { @Override public void onSuccess(final List<BmobFile> files, final List<String> urls) { phontoFiles.setPhotos(files); phontoFiles.save(new SaveListener<String>() { @Override public void done(String objectId, BmobException e) { //// if (urls.size() == 1) {//如果第一个文件上传完成 // } else if (urls.size() == 2) {//第二个文件上传成功 // } if (e == null) { savePulish(content, phontoFiles); //finish(); //mProgressDialog.dismiss(); } else { //mProgressDialog.dismiss(); } } }); } @Override public void onError(int statuscode, String errormsg) { //ShowToast("错误码"+statuscode +",错误描述:"+errormsg); ToastUtil.show(PublishActivity.this, "错误码" + statuscode + ",错误描述:" + errormsg, Toast.LENGTH_SHORT); } @Override public void onProgress(int curIndex, int curPercent, int total, int totalPercent) { //1、curIndex--表示当前第几个文件正在上传 //2、curPercent--表示当前上传文件的进度值(百分比) //3、total--表示总的上传文件数 //4、totalPercent--表示总的上传进度(百分比) } }); } //Log.e(TAG, "===ps++++objectId" + ps.getObjectId()); } /** * 获取缓存图片地址 * * @param context * @param list */ private void getCacheImgFiles(Context context, List<String> list) { filePhotos = new ArrayList<String>(); for (String path : list) { filePhotos.add(compressBitmap(context, path)); } } /** * 压缩指定路径图片,并将其保存在缓存目录中,并获取到缓存后的图片路径 * * @param context * @param path * @return */ private String compressBitmap(Context context, String path) { Bitmap bitmap = compressBitmapFromFile(path); File srcFile = new File(path); String desPath = getImageCacheDir(context) + srcFile.getName(); File file = new File(desPath); try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);//50 } catch (FileNotFoundException e) { e.printStackTrace(); } return desPath; } /** * 获取图片缓存路径 * * @param context * @return */ private String getImageCacheDir(Context context) { String cachepath; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { cachepath = context.getExternalCacheDir().getPath(); } else { cachepath = context.getCacheDir().getPath(); } return cachepath; } private byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } /** * 基于质量的压缩算法,保证图片大小小于200k * * @param bitmap * @return */ private Bitmap compressBitmap(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); int options = 100; while (baos.toByteArray().length / 1024 > 1024) { baos.reset(); bitmap.compress(Bitmap.CompressFormat.PNG, options, baos); options -= 10; } ByteArrayInputStream byins = new ByteArrayInputStream(baos.toByteArray()); return BitmapFactory.decodeStream(byins, null, null); } /** * 压缩指定路径的图片,并得到图片对象 * * @param path * @return */ private Bitmap compressBitmapFromFile(String path) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(path, options); options.inJustDecodeBounds = false; int width = options.outWidth; int height = options.outHeight; float widthRadio = 1080f; float heightRadio = 1920f; int inSampleSize = 1; if (width > height && width > widthRadio) { inSampleSize = (int) (width * 1.0f / widthRadio); } else if (width < height && height > heightRadio) { inSampleSize = (int) (height * 1.0f / heightRadio); } if (inSampleSize <= 0) { inSampleSize = 1; } options.inSampleSize = inSampleSize; bitmap = BitmapFactory.decodeFile(path, options); return compressBitmap(bitmap); } }