android广播接收器上的类强制转换异常

时间:2013-11-22 08:43:32

标签: android classcastexception

将文件上传到服务器并使用计时器自动分配时间。但是我得到了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

4 个答案:

答案 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)

清理项目,可能会解决问题。