0

こんにちは、アプリケーションから他のアプリケーションのキャッシュを消去しようとしています。次のコードを使用して、4.1.2 バージョンの Android まで、他のアプリケーションのキャッシュを消去できます。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;

public class CacheNukerActivity extends Activity {
private static final long ALL_YOUR_CACHE_ARE_BELONG_TO_US=1000000000L;
private CachePackageDataObserver mClearCacheObserver;
private TextView tv=null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tv=(TextView)findViewById(R.id.status);
tv.setText("Clearing cache...");

clearCache();
}

 private final void clearCache() {
if (mClearCacheObserver == null) {
  mClearCacheObserver=new CachePackageDataObserver();
}

PackageManager mPM=getPackageManager();

@SuppressWarnings("rawtypes")
final Class[] classes= { Long.TYPE, IPackageDataObserver.class };

Long localLong=Long.valueOf(ALL_YOUR_CACHE_ARE_BELONG_TO_US);
try {
  Method localMethod=
      mPM.getClass().getMethod("freeStorageAndNotify", classes);

  try {
    localMethod.invoke(mPM, localLong, mClearCacheObserver);
  }
  catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}
catch (NoSuchMethodException e1) {
  // TODO Auto-generated catch block
  e1.printStackTrace();
}
}

private class CachePackageDataObserver extends
  IPackageDataObserver.Stub {
public void onRemoveCompleted(String packageName, boolean succeeded) {
  tv.post(new Runnable() {
    public void run() {
      tv.append(" cache cleared");
    }
  });
}
}
}

IPackageDataObserverコードは

package android.content.pm;

oneway interface IPackageDataObserver {
    void onRemoveCompleted(in String packageName, boolean succeeded);
}

しかし、4.2 以降の Android バージョンで同じアプリケーションを実行すると、キャッシュがクリアされません。誰か助けてください。

4

1 に答える 1