0

您好,我的应用中有谷歌云消息这是我的主要代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import pdf2app.actionBars.ActionBarMain;
import pdf2app.config.GlobalConfig;
import pdf2app.database.ObjectsDBAdapter;
import pdf2app.debug.MY_DEBUG;
import pdf2app.gallery.ListViewGallery;
import pdf2app.helpers.ThumbnailsGalleryGenerator;
import pl.spot.p2a.R;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.AssetManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Window;
import com.google.android.gcm.GCMRegistrar;
import com.radaee.pdf.Global; 


public class MainActivity extends Activity{
    public static final int DELETE = 0;
    public static final String SENDER_ID = "410016639123";
    private static final int APP_ID = 1;
    public static int VIEW_ID = 2; 
    private String registrationStatus = "Not yet registered";
    private boolean listviewSelected;
    private String TAG = "push";
     private String regId = "";
    Bundle extras;
    IntentFilter gcmFilter;
    private String broadcastMessage = "No broadcast message";
    /** Called when the activity is first created. */
     private BroadcastReceiver gcmReceiver = new BroadcastReceiver() {


            @Override
            public void onReceive(Context context, Intent intent) {
                broadcastMessage = intent.getExtras().getString("gcm");

                if (broadcastMessage != null) {
                    // display our received message
                    Log.v("Broadcast", broadcastMessage);
                }

            }
        };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//      checkNotNull(SENDER_ID, "SENDER_ID");
//      GCMRegistrar.checkDevice(this);
//      GCMRegistrar.checkManifest(this);


        requestWindowFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_main);
        extras = getIntent().getExtras();


        if (savedInstanceState == null) {

            if(extras == null) {
                GlobalConfig.setAPPLICATION_ID(APP_ID);

            } else {

                GlobalConfig.setAPPLICATION_ID(extras.getInt("application_id", 0));
            }
        } else {
           MY_DEBUG.print("SavedInstanceState is not null");
        }
        GlobalConfig.setBookmark(0);

        gcmFilter = new IntentFilter();
        gcmFilter.addAction("GCM_RECEIVED_ACTION");

        registerClient();

//      //notifications
//      final String regId = GCMRegistrar.getRegistrationId(this);
//      
//       
//      if (regId.equals("")) {
//          GCMRegistrar.register(this, SENDER_ID);
//      } else {
//          Log.v(TAG, "Already registered");
//          }
//
//      Log.v(TAG, "registration id  "+regId);


        SharedPreferences preferences = getSharedPreferences(GlobalConfig.getApp(), MODE_WORLD_READABLE);
        listviewSelected = preferences.getBoolean(ActionBarMain.LISTVIEW_SELECTED, false);
        GlobalConfig.setLastUpdate(preferences.getLong(ObjectsDBAdapter.TIMESTAMP, 0));
        GlobalConfig.getUser(this);

        Intent intent1 = new Intent(this, DownloaderService.class);
        intent1.putExtra(DownloaderService.TYPE, DownloaderService.GET_CONFIG);
        startService(intent1);

        AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){

            @Override
            protected Void doInBackground(Void... params) {
                CopyAssets();
                return null;
            }
            protected void onPostExecute(Void result) {
            };
        }.execute();
        finish();
    }

    public void registerClient() {

        try {
            // Check that the device supports GCM (should be in a try / catch)
            GCMRegistrar.checkDevice(this);

            // Check the manifest to be sure this app has all the required
            // permissions.
            GCMRegistrar.checkManifest(this);

            // Get the existing registration id, if it exists.
            regId = GCMRegistrar.getRegistrationId(this);

            if (regId.equals("")) {

                registrationStatus = "Registering...";

                // register this device for this project
                GCMRegistrar.register(this, SENDER_ID);
                regId = GCMRegistrar.getRegistrationId(this);

                registrationStatus = "Registration Acquired";

                // This is actually a dummy function.  At this point, one
                // would send the registration id, and other identifying
                // information to your server, which should save the id
                // for use when broadcasting messages.
                sendRegistrationToServer();

            } else {

                registrationStatus = "Already registered";

            }


        } catch (Exception e) {

            e.printStackTrace();
            registrationStatus = e.getMessage();

        }

        Log.d(TAG, registrationStatus);

        // This is part of our CHEAT.  For this demo, you'll need to
        // capture this registration id so it can be used in our demo web
        // service.
        Log.d(TAG, regId);

    }

     private void sendRegistrationToServer() {
            // This is an empty placeholder for an asynchronous task to post the
            // registration
            // id and any other identifying information to your server.
        }

        @Override
        public void onSaveInstanceState(Bundle savedInstanceState) {

            super.onSaveInstanceState(savedInstanceState);

            savedInstanceState.putString("BroadcastMessage", broadcastMessage);

        }

        @Override
        public void onRestoreInstanceState(Bundle savedInstanceState) {

            super.onRestoreInstanceState(savedInstanceState);

            broadcastMessage = savedInstanceState.getString("BroadcastMessage");
            Log.v("BroadCastMes", broadcastMessage);

        }   
    private void checkNotNull(Object reference, String name) {
        if (reference == null) {
            throw new NullPointerException(
                    getString(R.string.error_config, name));
        }
    }

    @Override
    protected void onPause() {
        GCMRegistrar.unregister(this);
        super.onPause();

    }
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(gcmReceiver, gcmFilter);

    }

    @Override
    public void onDestroy() {

        GCMRegistrar.onDestroy(this);

        super.onDestroy();
    }
    /**
     * checks whether the sdcard is mounted
     * @param requireWriteAccess
     * @return whether the sdcard is mounted 
     */
    static public boolean hasStorage(boolean requireWriteAccess) {
        //TODO: After fix the bug,  add "if (VERBOSE)" before logging errors.
        String state = Environment.getExternalStorageState();
        Log.v("tag", "storage state is " + state);

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            if (requireWriteAccess) {
                boolean writable = checkFsWritable();
                Log.v("tag", "storage writable is " + writable);
                return writable;
            } else {
                return true;
            }
        } else if (!requireWriteAccess && Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }

    private static boolean checkFsWritable() {
        // Create a temporary file to see whether a volume is really writeable.
        // It's important not to put it in the root directory which may have a
        // limit on the number of files.
        String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM";
        File directory = new File(directoryName);
        if (!directory.isDirectory()) {
            if (!directory.mkdirs()) {
                return false;
            }
        }
        return directory.canWrite();
    }

    /**
     * copies all assets (icons, terms document) to the sdcard if they are missing. 
     */
    private void CopyAssets() {
        Global.Init(this);

        File f = new File(GlobalConfig.getBaseDirectory());
        if (!f.exists())
            f.mkdirs();

            File file = new File(GlobalConfig.getTermsFile());
            if(file.exists()){
                MY_DEBUG.LOG(getClass(), "getApplicationID" + GlobalConfig.getApplicationID());
                MY_DEBUG.LOG(getClass(), "getAPPLICATION_ID" + GlobalConfig.getAPPLICATION_ID());
                ThumbnailsGalleryGenerator.generateTermsThumbs(GlobalConfig.getTermsFile(), this);
                // TODO generate terms database pages
            } else {
                if(GlobalConfig.getAPPLICATION_ID() == APP_ID) {
                    AssetManager assetManager = getAssets();
                    String[] files = null;
                    try {
                        files = assetManager.list("Files");
                    } catch (IOException e) {
                        MY_DEBUG.print(e);
                    }

                    InputStream in = null;
                    OutputStream out = null;

                    try {
                        in = assetManager.open("Files/terms.pdf");

                        out = new FileOutputStream(GlobalConfig.getTermsFile());

                        copyFile(in, out);
                        in.close();
                        in = null;
                        out.flush();
                        out.close();
                        out = null;
                    } catch (IOException e) {
//                      e.printStackTrace();
//                      Log.e("tag", e.getMessage());
                    } 
                    ThumbnailsGalleryGenerator.generateTermsThumbs(GlobalConfig.getTermsFile(), this);
                }
            }

//        String[] icons = null;
//        try {
//          File iconsDir = new File(f.getPath() + "/icons");
//          if (!iconsDir.exists())
//              iconsDir.mkdirs();
//          
//          icons = assetManager.list("Files/icons");
//            for(String icon : icons) {
//              in = null;
//                out = null;
//                if(!(new File(GlobalConfig.getBaseDirectory() +"/icons" + icon).exists())){
//                  in = assetManager.open("Files/icons/"+icon);   // if files resides inside the "Files" directory itself
//                  out = new FileOutputStream(GlobalConfig.getBaseDirectory() + "/icons/" + icon);
//              
//                  copyFile(in, out);
//                  in.close();
//                  in = null;
//                  out.flush();
//                  out.close();
//                  out = null;
//                }
//            }
//        } catch (Exception e) {
//            Log.e("tag", e.getMessage());
//        }
    }

    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1){
          out.write(buffer, 0, read);
        }
    }

    @Override
    public void finish() {
        Intent intent = new Intent();
        if (listviewSelected) {
            intent = new Intent(MainActivity.this, ListViewGallery.class);
            intent.putExtra("ClassName", "action_bar_listView_icon");
            startActivity(intent);
        } else {
            intent = new Intent(MainActivity.this, CoverFlowActivity.class);
            intent.putExtra("ClassName", "action_bar_coverView_icon");
            startActivity(intent);
        }

        super.finish();
    }


}

这是 GMCIntentService:

public class GCMIntentService extends GCMBaseIntentService {

    private static final String PROJECT_ID = "410016639123";

    private static final String TAG = "GCMIntentService";

    public GCMIntentService()
    {
        super(PROJECT_ID);
        Log.d(TAG, "GCMIntentService init");
    }


    @Override
    protected void onError(Context ctx, String sError) {
        // TODO Auto-generated method stub
        Log.d(TAG, "Error: " + sError);

    }

    @Override
    protected void onMessage(Context ctx, Intent intent) {

        Log.d(TAG, "Message Received");

        String message = intent.getStringExtra("message");

        sendGCMIntent(ctx, message);

    }


    private void sendGCMIntent(Context ctx, String message) {

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("GCM_RECEIVED_ACTION");

        broadcastIntent.putExtra("gcm", message);

        ctx.sendBroadcast(broadcastIntent);

    }


    @Override
    protected void onRegistered(Context ctx, String regId) {
        // TODO Auto-generated method stub
        // send regId to your server
        Log.d(TAG, regId);

    }

    @Override
    protected void onUnregistered(Context ctx, String regId) {
        // TODO Auto-generated method stub
        // send notification to your server to remove that regId

    }

}

并表现:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="2"
    android:versionName="1"
    android:installLocation="auto">

    <uses-sdk
        android:minSdkVersion="12" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <permission android:name="pl.spot.p2a.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="pl.spot.p2a.permission.C2D_MESSAGE" /> 
    <!-- App receives GCM messages. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />

    <uses-permission android:name="android.permission.READ_OWNER_DATA" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo"
        android:largeHeap="true" >
        <activity
            android:name="pdf.activities.MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>





        <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.example.test" />  
            </intent-filter>   
        </receiver>
        <service
            android:name="com.example.test">
        </service>
    </application>
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true" />

</manifest>

在日志中我没有得到 api 密钥。

This is log:
12-18 10:54:58.132: D/dalvikvm(4582): WAIT_FOR_CONCURRENT_GC blocked 0ms
12-18 10:54:58.192: D/dalvikvm(4582): GC_FOR_ALLOC freed 102K, 8% free 12264K/13319K, paused 14ms, total 14ms
12-18 10:54:58.192: I/dalvikvm-heap(4582): Grow heap (frag case) to 13.447MB for 614416-byte allocation
12-18 10:54:58.212: D/dalvikvm(4582): GC_CONCURRENT freed 1K, 8% free 12863K/13959K, paused 12ms+1ms, total 21ms
12-18 10:54:58.227: D/dalvikvm(4582): GC_FOR_ALLOC freed 0K, 8% free 12863K/13959K, paused 11ms, total 11ms
12-18 10:54:58.227: I/dalvikvm-heap(4582): Grow heap (frag case) to 15.789MB for 2457616-byte allocation
12-18 10:54:58.252: D/dalvikvm(4582): GC_CONCURRENT freed 0K, 7% free 15263K/16391K, paused 11ms+2ms, total 23ms
12-18 10:54:58.252: D/dalvikvm(4582): WAIT_FOR_CONCURRENT_GC blocked 6ms
12-18 10:54:58.277: D/GCMRegistrar(4582): resetting backoff for com.example.test
12-18 10:54:58.277: V/GCMRegistrar(4582): Registering app com.example.test of senders 410016639123
12-18 10:54:58.287: D/push(4582): Registration Acquired
12-18 10:54:58.302: D/dalvikvm(4582): Trying to load lib /data/data/pl.spot.p2a/lib/librdpdf.so 0x42818728
12-18 10:54:58.312: D/dalvikvm(4582): Added shared lib /data/data/pl.spot.p2a/lib/librdpdf.so 0x42818728
12-18 10:54:58.377: V/MainActivity(4582): getApplicationID1
12-18 10:54:58.377: V/MainActivity(4582): getAPPLICATION_ID1
12-18 10:54:58.377: V/generateTermsThumbs(4582): doc.open: /storage/sdcard0/pdf2app/1/terms.pdf
12-18 10:55:01.662: D/dalvikvm(4582): GC_CONCURRENT freed 997K, 12% free 15264K/17223K, paused 34ms+4ms, total 72ms
12-18 10:55:11.222: V/GCMBroadcastReceiver(4582): onReceive: com.google.android.c2dm.intent.REGISTRATION
12-18 10:55:11.222: V/GCMBroadcastReceiver(4582): GCM IntentService class: pl.spot.p2a.GCMIntentService
12-18 10:55:11.227: V/GCMBaseIntentService(4582): Acquiring wakelock

当我更改清单行时:android:name="com.example.test"on

android:name=".GCMIntentService" I get error:
12-18 11:04:10.412: E/AndroidRuntime(6424): FATAL EXCEPTION: main
12-18 11:04:10.412: E/AndroidRuntime(6424): java.lang.RuntimeException: Unable to instantiate service com.example.test.GCMIntentService: java.lang.ClassNotFoundException: pl.spot.p2a.GCMIntentService
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2388)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.app.ActivityThread.access$1600(ActivityThread.java:140)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.os.Looper.loop(Looper.java:137)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.app.ActivityThread.main(ActivityThread.java:4898)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at java.lang.reflect.Method.invoke(Method.java:511)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at dalvik.system.NativeStart.main(Native Method)
12-18 11:04:10.412: E/AndroidRuntime(6424): Caused by: java.lang.ClassNotFoundException: com.example.test.GCMIntentService
12-18 11:04:10.412: E/AndroidRuntime(6424):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
12-18 11:04:10.412: E/AndroidRuntime(6424):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2385)
12-18 11:04:10.412: E/AndroidRuntime(6424):     ... 10 more

你能告诉我为什么吗?

4

1 回答 1

3

您必须提供

<service android:name="package_name.GCMIntentService" />

而不是您在清单文件中提供的包名称。

GCMIntentService是我的服务课。

于 2012-12-18T10:13:40.020 回答