Sfoglia il codice sorgente

RA Image Android
提交上传管理器,测试文件上传成功,界面刷新回调

Ray Zhang 8 anni fa
parent
commit
7052bc63a0

+ 0 - 1
RA Image/app/app.iml

@@ -89,7 +89,6 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />

+ 6 - 1
RA Image/app/src/main/AndroidManifest.xml

@@ -113,7 +113,12 @@
 
         <service
             android:name=".UploadService"
-            android:label="usai upload service" />
+            android:label="usai upload service" >
+
+            <intent-filter>
+                <action android:name="com.usai.raimage.uploadservice" />
+            </intent-filter>
+            </service>
 
         <activity
             android:name=".AboutActivity"

+ 2 - 2
RA Image/app/src/main/java/com/usai/redant/raimage/MainActivity.java

@@ -258,8 +258,8 @@ public class MainActivity extends AppCompatActivity
 						task.putString("url",RedAntApplication.active_address);
 
 						String md5 = MD5.md5sum(path);
-						String encryptUser = AES.encrypt("usai2010",RedAntApplication.user);
-						String encryptPwd = AES.encrypt("usai2010",RedAntApplication.password);
+						String encryptUser = AES.encrypt("usai",RedAntApplication.user);
+						String encryptPwd = AES.encrypt("usai",RedAntApplication.password);
 
 						Bundle params = new Bundle();
 						params.putString("user",encryptUser);

+ 13 - 6
RA Image/app/src/main/java/com/usai/redant/raimage/RedAntApplication.java

@@ -1,9 +1,5 @@
 package com.usai.redant.raimage;
 
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
 import android.app.AlarmManager;
 import android.app.Application;
 import android.app.PendingIntent;
@@ -12,12 +8,15 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.SystemClock;
 import android.provider.Settings;
-import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
 
 import org.json.JSONObject;
 
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
 public class RedAntApplication extends Application
 {
     private static RedAntApplication instance;  
@@ -110,5 +109,13 @@ public class RedAntApplication extends Application
 
 		
 		
-    }  
+    }
+
+
+	@Override
+	protected void finalize() throws Throwable {
+
+		Log.d("raimage", "finalize: !!!!!!!!!!!!!!!!!!!!!!!%%%%%%%%%%%%%%%%%%%");
+		super.finalize();
+	}
 }

+ 54 - 4
RA Image/app/src/main/java/com/usai/redant/raimage/UploadService.java

@@ -2,10 +2,14 @@ package com.usai.redant.raimage;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 
 import com.usai.util.Crypto;
 import com.usai.util.Network;
+import com.usai.util.RAUploadManager;
+import com.usai.util.RAUtil;
 import com.usai.util.dbUtil;
 import com.usai.util.dbgUtil;
 
@@ -22,6 +26,7 @@ import android.location.LocationListener;
 import android.location.LocationManager;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
+import android.os.Binder;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.IBinder;
@@ -37,16 +42,30 @@ public class UploadService extends Service
 	LocationManager			locationManager;
 	LocationListener		locationListener;
 
+	RAUploadManager			uploadManager = new RAUploadManager();
+
 	// private boolean location_changed = false;
 
 	@Override
 	public IBinder onBind(Intent intent)
 	{
 		// TODO Auto-generated method stub
-		return null;
+        return new MyBinder();
 	}
 
-	@Override
+
+
+    public class MyBinder extends Binder{
+        /**
+         * 获取当前Service的实例
+         * @return
+         */
+        public UploadService getService(){
+            return UploadService.this;
+        }
+    }
+
+    @Override
 	public void onCreate()
 	{
 
@@ -67,6 +86,7 @@ public class UploadService extends Service
 		msgFilter.addAction("REDANT.POP.REQUEST_LOCATION");
 		msgFilter.addAction("REDANT.POP.RESET_LOCATION");
 		msgFilter.addAction("REDANT.POP.QUERY_UPLOAD_STATE");
+        msgFilter.addAction("REDANT.RAImage.ADD_TASK");
 		msgFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
 		msgFilter.addAction("REDANT.POP.RETRY_UPLOAD");
 		
@@ -129,6 +149,13 @@ public class UploadService extends Service
 		if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
 		{
 
+//            RedAntApplication.getInstance()
+
+//            if(!RAUtil.checkPermission(this.getApplicationContext(),"android.permission.ACCESS_FINE_LOCATION"))
+//                return;
+
+
+
 			locationManager.requestLocationUpdates(
 					LocationManager.GPS_PROVIDER, 60 * 1000, 50,
 					locationListener);
@@ -430,7 +457,8 @@ public class UploadService extends Service
 		}
 	}
 
-	private BroadcastReceiver	uploadReceiver	= new BroadcastReceiver()
+	private BroadcastReceiver	uploadReceiver	=
+            new BroadcastReceiver()
 												{
 
 													public void onReceive(
@@ -441,7 +469,29 @@ public class UploadService extends Service
 																.getAction();
 														// 如果捕捉到的action是ACTION_BATTERY_CHANGED
 
-														if ("REDANT.POP.REQUEST_LOCATION"
+                                                        if("REDANT.RAImage.ADD_TASK".equals(action))
+                                                        {
+
+                                                            ArrayList<Bundle> tasks= intent.getParcelableArrayListExtra("tasks");
+
+//                                                            uploadManager.addTasks();
+//
+//                                                            Bundle task=intent.getExtras();
+//
+//                                                            ArrayList<Bundle> arr= new ArrayList<Bundle>();
+//                                                            arr.add(new Bundle());
+//                                                            arr.add(new Bundle());
+//                                                            arr.add(new Bundle());
+//                                                            intent.putParcelableArrayListExtra("tasks",arr);
+//
+//                                                            intent.putParcelableArrayListExtra()
+//                                                            HashMap<>
+
+
+                                                            uploadManager.addTasks(tasks);
+                                                        }
+
+														else if ("REDANT.POP.REQUEST_LOCATION"
 																.equals(action))
 														{
 															check_location();

+ 65 - 57
RA Image/app/src/main/java/com/usai/util/Network.java

@@ -1,5 +1,44 @@
 package com.usai.util;
 
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.usai.redant.raimage.RedAntApplication;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.HttpVersion;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.HttpHostConnectException;
+import org.apache.http.conn.scheme.PlainSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.protocol.HTTP;
+import org.json.JSONException;
+import org.json.JSONObject;
+
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.DataOutputStream;
@@ -26,66 +65,13 @@ import java.security.KeyStore;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Set;
-
 import java.util.UUID;
 
-import java.util.logging.Handler;
-
-
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
 
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.conn.HttpHostConnectException;
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.conn.ssl.SSLSocketFactory;
-import org.apache.http.entity.mime.HttpMultipartMode;
-import org.apache.http.entity.mime.MultipartEntity;
-import org.apache.http.entity.mime.content.FileBody;
-import org.apache.http.entity.mime.content.StringBody;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-import org.apache.http.protocol.HTTP;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import com.usai.redant.raimage.RedAntApplication;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.Message;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-
-import static android.R.attr.key;
-import static android.R.attr.parentActivityName;
-import static android.R.attr.tag;
-
 public class Network
 {
 	private static final int	REQUEST_TIMEOUT					= 15 * 1000;			// request
@@ -128,8 +114,8 @@ public class Network
 	static String				URL_UPLOAD_PHOTO				= "handset.php";
 	@Deprecated
 	static String				URL_VERIFY_USER					= "handset_login.php";
-	static String				URL_LOGIN					= "index.php?_action=handset_new ";
-
+	static String				URL_LOGIN					= "index.php?_action=handset_new";
+	static String				URL_UPLOAD					= "index.php?_action=handset_new";
 	public static class SSLSocketFactoryEx extends SSLSocketFactory
 	{
 
@@ -1061,6 +1047,28 @@ public class Network
 	public static String UploadFile(String path ,String host,Bundle params,FileUploadListener listener){
 
 
+		try {
+			params.putString("app_ver", RedAntApplication.getInstance()
+                    .getPackageManager()
+                    .getPackageInfo("com.usai.redant.raimage", 0).versionName);
+			params.putInt("app_short_ver", RedAntApplication.getInstance()
+					.getPackageManager()
+					.getPackageInfo("com.usai.redant.raimage", 0).versionCode);
+			params.putString("deviceid",RedAntApplication.device_id);
+
+
+			if(!TextUtils.isEmpty(RedAntApplication.user))
+				params.putString("user", AES.encrypt("usai", RedAntApplication.user));
+			if(!TextUtils.isEmpty(RedAntApplication.password))
+				params.putString("password", AES.encrypt("usai", RedAntApplication.password));
+		} catch (PackageManager.NameNotFoundException e) {
+			e.printStackTrace();
+		}
+
+
+
+
+
 		File file = new File(path);
 		String TAG = "net_dbg@UploadFile";
 		   String CHARSET = "utf-8"; //设置编码
@@ -1110,7 +1118,7 @@ public class Network
 
 					}
 
-
+					Log.d(TAG, "================parms============");
 
 				}
 				sb.append(PREFIX);//开始拼接文件参数
@@ -1120,7 +1128,7 @@ public class Network
 				 * name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
 				 * filename是文件的名字,包含后缀名的 比如:abc.png
 				 */
-				sb.append("Content-Disposition: form-data; name=\"img\"; filename=\""+file.getName()+"\""+LINE_END);
+				sb.append("Content-Disposition: form-data; name=\"upfile\"; filename=\""+file.getName()+"\""+LINE_END);
 				sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);
 				sb.append(LINE_END);
 				//写入文件数据

+ 25 - 0
RA Image/app/src/main/java/com/usai/util/RAOperation.java

@@ -0,0 +1,25 @@
+package com.usai.util;
+
+
+import android.os.Bundle;
+
+/**
+ * Created by ray on 28/06/2017.
+ */
+
+public class RAOperation implements Runnable {
+    public Bundle task;
+    @Override
+    public void run() {
+
+
+//        BaseAdapter adapter;
+//        adapter.notifyDataSetChanged();
+//
+//        Bundle b;
+//        b.put
+
+    }
+
+
+}

+ 73 - 0
RA Image/app/src/main/java/com/usai/util/RAOperationQueue.java

@@ -0,0 +1,73 @@
+package com.usai.util;
+
+import android.os.Bundle;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * Created by ray on 28/06/2017.
+ */
+
+public class RAOperationQueue {
+
+    public interface OperationCallback {
+        /**
+            每个具体任务执行的回调
+         */
+        public void operate(Bundle taskinfo);
+    }
+
+    OperationCallback execCallback;
+    public void setCallback(OperationCallback callback)
+    {
+        execCallback=callback;
+    }
+    //并发队列
+    private ConcurrentLinkedQueue<Bundle> queue = new ConcurrentLinkedQueue<Bundle>();
+    // 最大并发数
+    public int MaxThread = 3;
+    //线程池
+    private ExecutorService es = Executors.newCachedThreadPool();
+
+//    public RAOperation runThread;
+    public void addOperation(final Bundle taskinfo)
+    {
+        queue.offer(taskinfo);
+        while (((ThreadPoolExecutor)es).getActiveCount()< MaxThread) {
+
+
+            es.submit(new Runnable() {
+                @Override
+                public void run() {
+
+                    while (!queue.isEmpty()) {
+                        Bundle task=queue.poll();
+
+                        System.out.println("running  tid="+Thread.currentThread().getId());
+//                        int min=1000;
+//                        int max=5000;
+//                        int sleep=new Random().nextInt(max)%(max-min+1) + min;
+//                        try{
+//                            Thread.currentThread().sleep(sleep);
+//                        }catch(InterruptedException ie){
+//                            ie.printStackTrace();
+//                        }
+                        execCallback.operate(task);
+                        System.out.println("     finish  tid="+Thread.currentThread().getId());
+                    }
+
+
+                }
+            });
+
+        }
+    }
+    public void stopQueue()
+    {
+        queue.clear();
+        es.shutdown();
+    }
+}

+ 229 - 2
RA Image/app/src/main/java/com/usai/util/RAUploadManager.java

@@ -1,13 +1,39 @@
 package com.usai.util;
 
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+
+import com.usai.redant.raimage.RedAntApplication;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.usai.util.Network.URL_UPLOAD;
+
 /**
  * Created by ray on 13/06/2017.
  */
 
 public class RAUploadManager {
-    public int maxThread;
+    public int maxThread=3;
     public int activeThread;
-    public int maxRetry;
+    public int maxRetry=2;
+
+    public Boolean autoStart=true;
+    public Boolean removeFinish=true;
+    public Boolean removeError=false;
+    public QueueStatus queue_status;
+
+    public RAUploadOperation.TaskStatus newtaskStatus= RAUploadOperation.TaskStatus.TaskStatusWait;
+    private ArrayList<Bundle> arr_queue;
+//    private List<Bundle> operation_queue;
+//    private ExecutorService es = Executors.newFixedThreadPool(3);//
+    // .newFixedThreadPool();
+//    private CountDownLatch latch = new CountDownLatch(maxThread);
+    private RAOperationQueue operation_queue;
     public enum QueueStatus {
         QueueStatusDefault,
         QueueStatusAdd,
@@ -15,4 +41,205 @@ public class RAUploadManager {
         QueueStatusFinishWithError,
         QueueStatusFinish
     }
+
+    UIUpdateListener uiUpdateListener;
+
+    public interface UIUpdateListener {
+        void onProgress(long index, double percentage);
+
+//        void onFinish(int code, String res/*, HashMap<String, List<String>> headers*/);
+    }
+
+//    class Poll implements Runnable {
+//        public void run() {
+//            // while (queue.size()>0) {
+//            while (!operation_queue.isEmpty()) {
+//                System.out.println(operation_queue.poll());
+//            }
+//            latch.countDown();
+//        }
+//    }
+
+    public RAUploadManager()
+    {
+        queue_status = QueueStatus.QueueStatusDefault;
+
+
+
+        SharedPreferences UMSetting = RedAntApplication.getInstance()
+                .getSharedPreferences("UploadManager", 0);
+
+        if(UMSetting!=null)
+        {
+            autoStart = UMSetting.getBoolean("auto_upload",true);
+            removeFinish = UMSetting.getBoolean("auto_rm_finish",true);
+            removeError = UMSetting.getBoolean("auto_rm_error",false);
+            maxRetry = UMSetting.getInt("retry_count",2);
+            newtaskStatus = RAUploadOperation.TaskStatus.values()[UMSetting.getInt("newtask_status",RAUploadOperation.TaskStatus.TaskStatusWait.ordinal())];
+
+            maxThread = UMSetting.getInt("max_thread",3);
+
+
+
+        }
+        operation_queue = new RAOperationQueue();
+        operation_queue.setCallback(new RAOperationQueue.OperationCallback() {
+            @Override
+            public void operate(final Bundle taskinfo) {
+
+                String path=taskinfo.getString("file");
+                String url=taskinfo.getString("url")+""+URL_UPLOAD;
+
+                Network.UploadImage(path, taskinfo.getBundle("params"), url, new Network.FileUploadListener() {
+                    @Override
+                    public void onProgress(long pro, double percentage) {
+
+                        Log.d("", "onProgress: " + percentage);
+
+                        if (uiUpdateListener!=null) {
+                            int index = arr_queue.indexOf(taskinfo);
+                            uiUpdateListener.onProgress(index,percentage);
+                        }
+
+                    }
+
+                    @Override
+                    public void onFinish(int code, String res) {
+                        Log.d("", "onFinish: ");
+
+                    }
+                })
+
+//                int a=0;
+//                System.out.println(a+"running  tid="+Thread.currentThread().getId());
+//                int min=1000;
+//                int max=5000;
+//                int sleep=new Random().nextInt(max)%(max-min+1) + min;
+//                try{
+//                    Thread.currentThread().sleep(sleep);
+//                }catch(InterruptedException ie){
+//                    ie.printStackTrace();
+//                }
+//                System.out.println(a+"   "+sleep+"     finish  tid="+Thread.currentThread().getId());
+
+            }
+        });
+
+        //            operation_queue = new List<Bundle>() {};
+
+        loadTask();
+
+    }
+
+    private void loadTask()
+    {
+        stopAllTasks();
+        arr_queue = new ArrayList<Bundle>();
+        // 此处缺少读取持久话保存任务队列的实现。
+    };
+
+    public void addTask(Bundle task)
+    {
+        arr_queue.add(task);
+        if(newtaskStatus== RAUploadOperation.TaskStatus.TaskStatusWait)
+        {
+            startTask(task);
+        }
+    };
+    public void addTasks(ArrayList<Bundle> tasks)
+    {
+        arr_queue.addAll(tasks);
+        if(newtaskStatus== RAUploadOperation.TaskStatus.TaskStatusWait)
+        {
+            for (Bundle task:tasks)
+            {
+                startTask(task);
+            }
+
+        }
+
+    };
+    public void startTask(Bundle task)
+    {
+
+        operation_queue.addOperation(task);
+
+    };
+    public void removeTask(Bundle task)
+    {
+
+        arr_queue.remove(task);
+        String path = filePath(task);
+        File file = new File(path);
+        if(file.exists())
+        {
+            file.delete();
+        }
+
+    };
+    public void removeTasks(List<Bundle> tasks)
+    {
+        arr_queue.removeAll(tasks);
+        for(Bundle task:tasks)
+        {
+
+            String path = filePath(task);
+            File file = new File(path);
+            if(file.exists())
+            {
+                file.delete();
+            }
+        }
+    };
+    public void stopAllTasks()
+    {
+
+    };
+    public void stopTask(Bundle task)
+    {
+        if(task.getInt("status")!= RAUploadOperation.TaskStatus.TaskStatusStart.ordinal()&&task.getInt("status")!= RAUploadOperation.TaskStatus.TaskStatusWait.ordinal())
+            return;
+
+//        RAUploadOperation
+
+
+    }
+    public void saveTasks()
+    {
+
+//        SharedPreferences pref = RedAntApplication.getInstance()
+//                .getSharedPreferences("RA Image", 0);
+//        SharedPreferences.Editor editor = pref.edit();
+//
+//        if (m_swSave.isChecked()&&!TextUtils.isEmpty(encryptPass)&&!TextUtils.isEmpty(encryptUser))
+//        {
+//            editor.putString("user", encryptUser);
+//            editor.putString("password", encryptPass);
+//            editor.putBoolean("kepppass", true);
+//        }
+//        else
+//        {
+//            editor.putString("user", null);
+//            editor.putString("password", null);
+//            editor.putBoolean("kepppass", false);
+//        }
+//
+//        editor.puts
+//
+//        editor.commit();
+
+    };
+
+
+
+    private String filePath(Bundle task)
+    {
+        String path = Environment.getExternalStorageDirectory().getPath();
+        path+="/"+task.getString("path");
+        path+="/"+task.getString("file");
+
+        return path;
+    }
+
+
 }