将文件上传到服务器并使用计时器自动分配时间。但是我得到了ClassCastException的错误:Activity无法转换为Broadcast接收器。 这是我的Activity类:
public class AlarmActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.alarm_main);
}
public void scheduleAlarm(View V)
{
Long time = new GregorianCalendar().getTimeInMillis()+30000;
Intent intentAlarm = new Intent(this, ServerActivity.class);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
Toast.makeText(this, "File Scheduled to the server", Toast.LENGTH_LONG).show();
}
}
ServerActivity:
public class ServerActivity extends Activity {
TextView messageText;
Button uploadButton;
int serverResponseCode = 0;
ProgressDialog dialog = null;
String upLoadServerUri = null;
final String uploadFilePath = "mypath";
final String uploadFileName = "myfile";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
uploadButton = (Button)findViewById(R.id.uploadButton);
messageText = (TextView)findViewById(R.id.messageText);
messageText.setText("Uploading file path :- 'path"+uploadFileName+"'");
upLoadServerUri = "serverpath";
uploadButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true);
new Thread(new Runnable()
{
public void run()
{
runOnUiThread(new Runnable()
{
public void run()
{
messageText.setText("uploading started.....");
}
});
uploadFile(uploadFilePath + "" + uploadFileName);
}
}).start();
}
});
}
public int uploadFile(String sourceFileUri)
{
String fileName = sourceFileUri;
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile())
{
dialog.dismiss();
Log.e("uploadFile", "Source File not exist :"
+uploadFilePath + "" + uploadFileName);
runOnUiThread(new Runnable()
{
public void run()
{
messageText.setText("Source File not exist :" +uploadFilePath + "" + uploadFileName);
}
});
return 0;
}
else
{
try
{
// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(upLoadServerUri);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", fileName);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
+ fileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
Log.i("uploadFile", "HTTP Response is : "
+ serverResponseMessage + ": " + serverResponseCode);
if(serverResponseCode == 200)
{
runOnUiThread(new Runnable()
{
public void run()
{
String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"+" serverpath"
+uploadFileName;
messageText.setText(msg);
Toast.makeText(UploadToServer.this, "File Upload Complete.",
Toast.LENGTH_SHORT).show();
}
});
}
//close the streams //
fileInputStream.close();
dos.flush();
dos.close();
}
catch (MalformedURLException ex)
{
dialog.dismiss();
ex.printStackTrace();
runOnUiThread(new Runnable()
{
public void run()
{
messageText.setText("MalformedURLException Exception : check script url.");
Toast.makeText(UploadToServer.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
}
catch (Exception e)
{
dialog.dismiss();
e.printStackTrace();
runOnUiThread(new Runnable()
{
public void run()
{
messageText.setText("Got Exception : see logcat ");
Toast.makeText(UploadToServer.this, "Got Exception : see logcat ",
Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload file to server Exception", "Exception : "
+ e.getMessage(), e);
}
dialog.dismiss();
return serverResponseCode;
}
}
}
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aisu.testingapps"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="12" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".AlarmActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".ServerActivity"/>
</application>
</manifest>
我的logcat是:
11-22 04:42:30.989: E/AndroidRuntime(1086): FATAL EXCEPTION: main
11-22 04:42:30.989: E/AndroidRuntime(1086): java.lang.RuntimeException: Unable to instantiate receiver com.example.ServerActivity: java.lang.ClassCastException: com.example.ServerActivity cannot be cast to android.content.BroadcastReceiver
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2100)
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.app.ActivityThread.access$1500(ActivityThread.java:123)
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.os.Looper.loop(Looper.java:137)
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.app.ActivityThread.main(ActivityThread.java:4429)
11-22 04:42:30.989: E/AndroidRuntime(1086): at java.lang.reflect.Method.invokeNative(Native Method)
11-22 04:42:30.989: E/AndroidRuntime(1086): at java.lang.reflect.Method.invoke(Method.java:511)
11-22 04:42:30.989: E/AndroidRuntime(1086): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
11-22 04:42:30.989: E/AndroidRuntime(1086): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
11-22 04:42:30.989: E/AndroidRuntime(1086): at dalvik.system.NativeStart.main(Native Method)
11-22 04:42:30.989: E/AndroidRuntime(1086): Caused by: java.lang.ClassCastException: com.aisu.testingapps.AndroidUploadActivity cannot be cast to android.content.BroadcastReceiver
11-22 04:42:30.989: E/AndroidRuntime(1086): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2095)
11-22 04:42:30.989: E/AndroidRuntime(1086): ... 10 more
答案 0 :(得分:0)
ServerActivity
活动不是接收者。
您在AndroidManifest.xml
答案 1 :(得分:0)
<receiver android:name=".ServerActivity"/>
您已将ServerActivity注册为BroadcastReciever,但我可以从您的代码中看到ServerActivity是一个Activity。这就是为什么你得到classcastexception,因为android正试图将Activity转换为BroadcastReciever。如果要将任何类用作BroadcastReciever,则您的类需要扩展BroadcastReciever。
答案 2 :(得分:0)
在您的清单中,在应用程序下添加此内容。
<receiver
android:name="GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.gcm" />
</intent-filter>
</receiver>
创建一个类作为GcmBroadcastReceiver 并使用此代码,
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(),
GcmIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
答案 3 :(得分:-1)
清理项目,可能会解决问题。