代码是获取联系人列表。但是有一个错误。请帮我解决。
第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);
}
});
}
}
答案 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();