第42行无法生成静态引用错误

时间:2014-04-08 08:24:32

标签: java android eclipse

代码是获取联系人列表。但是有一个错误。请帮我解决。 第42行的mContext返回错误"无法从类型contextwrapper"中对非静态方法getapplicationcontext()进行静态引用。

package com.example.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.ContactsContract;
import android.widget.ImageButton;

import android.util.Log;
import android.view.View;
  import android.view.View.OnClickListener;

public class MainActivity extends Activity {

ImageButton imageButton;
Context mContext =  getApplicationContext();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    addListenerOnButton();
    data();
    getVcardString();
}
public static void getVcardString() {   


    String path = null;     
    String vfile = null;; 
     vfile = "Contacts.vcf"; 

    Cursor phones =              mContext.getContentResolver(). query(ContactsContract.     CommonDataKinds.Phone.CONTENT_URI, null,null, null, null);

    phones.moveToFirst();
    Log.i("Number of contacts", "cursorCount" +phones.getCount());  
    for(int i =0;i<phones.getCount();i++)   {       

         String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
         Log.i("lookupKey", " " +lookupKey);
         Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
         AssetFileDescriptor fd;

         try  {
             fd = mContext.getContentResolver().openAssetFileDescriptor(uri, "r");
             FileInputStream fis = fd.createInputStream();
             byte[] buf = new byte[(int) fd.getDeclaredLength()];
             fis.read(buf);
             String VCard = new String(buf);          

             path = Environment.getExternalStorageDirectory().toString() +    File.separator + vfile;
             FileOutputStream mFileOutputStream = new FileOutputStream(path, true);
             mFileOutputStream.write(VCard.toString().getBytes());    

             phones.moveToNext();               

             File filevcf = new File(path);
             Log.i("file", "file" +filevcf);

         }catch(Exception e1) {
             e1.printStackTrace();  
         }
    }       
    Log.i("TAG", "No Contacts in Your Phone");          
}

protected void data() {             
    File filelocation = filevcf ;     
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
    sharingIntent.setType("vnd.android.cursor.dir/email");      
    sharingIntent.setType("application/x-vcard");       
    sharingIntent.putExtra(Intent.EXTRA_EMAIL, "mail@gmail.com" );       sharingIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://"+filelocation.getAbsolutePath()));
    startActivity(Intent.createChooser(sharingIntent, "Send email"));            
 }  

public void addListenerOnButton() {
    final Context context =   getApplicationContext();


    imageButton = (ImageButton) findViewById(R.id.imageButton1);

    imageButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {


            Intent intent1 = new Intent(context, secondjav.class);
                        startActivity(intent1);   


        }

    });

  }

}

3 个答案:

答案 0 :(得分:0)

问题

此错误表示您尝试在mContext中访问getVcardString(),这是一个实例字段,这是一种静态方法(因此不依赖于实例)。

注意:正如@ KiKMak42指出的那样,我假设你现在得到的错误是 mContext ,而不是 {{ 1}} 方法。

解决方案

您可以执行以下两项操作之一:

  • 删除getApplicationContext()关键字,使此方法成为非静态方法。如果您这样做,则需要此类的实例来调用此方法,因此static将存在。
  • 添加上下文作为方法的参数(并且不再引用实例字段mContext

要完成答案,在任何其他情况下(没有双关语意)你在技术上也可以使mContext字段静态(取决于你使用它)。但是,它很少是最好的选择,而你显然不想这样做。对于Android中的任何mContext,您永远不会想要这样做。

答案 1 :(得分:0)

如果你真的需要你的方法“getVcardString()”保持静态,那么你应该做这样的事情: 为扩展android.app.Application

的应用程序创建新类
public class MyApplication extends Application {
   static Context appContext;

   public MyApplication() {
       super();
   }

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

      appContext = getApplicationContext();
   }

   public static Context getContext() {
       return appContext;
   }
}

将清单中的此属性添加到应用程序代码:

android:name=".MyApplication"

并在你的getVcardString()方法中使用mContext使用MyApplication类的静态方法:

MyApplication.getContext()
通过这种方式,您可以在应用程序的每个位置访问应用程序上下文。

答案 2 :(得分:-2)

中删除final
final Context context =   getApplicationContext();